Skip to content

Commit

Permalink
1. [FEATURE]::add tac for ep20.
Browse files Browse the repository at this point in the history
  • Loading branch information
whtoo committed Oct 17, 2023
1 parent c355582 commit 069120b
Show file tree
Hide file tree
Showing 76 changed files with 1,180 additions and 772 deletions.
12 changes: 6 additions & 6 deletions ep11/src/main/java/org/teachfx/antlr4/Math.g4
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
grammar Math;

compileUnit
: expr EOF
: varSlot EOF
;

expr
: '(' expr ')' # parensExpr
| op=('+'|'-') expr # unaryExpr
| left=expr op=('*'|'/') right=expr # infixExpr
| left=expr op=('+'|'-') right=expr # infixExpr
varSlot
: '(' varSlot ')' # parensExpr
| op=('+'|'-') varSlot # unaryExpr
| left=varSlot op=('*'|'/') right=varSlot # infixExpr
| left=varSlot op=('+'|'-') right=varSlot # infixExpr
| value=NUM # numberExpr
;

Expand Down
2 changes: 1 addition & 1 deletion ep11/src/main/java/org/teachfx/antlr4/Math.interp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ WS

rule names:
compileUnit
expr
varSlot


atn:
Expand Down
14 changes: 7 additions & 7 deletions ep12/src/main/java/org/teachfx/antlr4/ep12/parser/Math.g4
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@ grammar Math;
package org.teachfx.antlr4.ep12.parser;
}
compileUnit
: expr EOF
: varSlot EOF
| assign EOF
;

expr
: '(' expr ')' # parensExpr
| op=('+'|'-') expr # unaryExpr
| left=expr op=('*'|'/') right=expr # infixExpr
| left=expr op=('+'|'-') right=expr # infixExpr
varSlot
: '(' varSlot ')' # parensExpr
| op=('+'|'-') varSlot # unaryExpr
| left=varSlot op=('*'|'/') right=varSlot # infixExpr
| left=varSlot op=('+'|'-') right=varSlot # infixExpr
| var=ID # varExpr
| value=NUM # numberExpr
;
assign : name=ID '=' value=expr EOF # assignExpr
assign : name=ID '=' value=varSlot EOF # assignExpr
;

OP_ADD: '+';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ WS

rule names:
compileUnit
expr
varSlot
assign


Expand Down
16 changes: 8 additions & 8 deletions ep13/src/main/java/org/teachfx/antlr4/Math.g4
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,25 @@ tokens {
}
compileUnit
: expr EOF
: varSlot EOF
| assign EOF
;

funcall : name=ID '(' params=parameters ')';

parameters : parameter (',' parameter)* | ;

parameter : expr;
parameter : varSlot;

expr
: '(' expr ')' # parensExpr
| op=('+'|'-') expr # unaryExpr
| left=expr op=('*'|'/') right=expr # infixExpr
| left=expr op=('+'|'-') right=expr # infixExpr
varSlot
: '(' varSlot ')' # parensExpr
| op=('+'|'-') varSlot # unaryExpr
| left=varSlot op=('*'|'/') right=varSlot # infixExpr
| left=varSlot op=('+'|'-') right=varSlot # infixExpr
| var=ID # varExpr
| value=NUM # numberExpr
;
assign : name=ID '=' value=expr EOF # assignExpr
assign : name=ID '=' value=varSlot EOF # assignExpr
;

OP_ADD: '+';
Expand Down
2 changes: 1 addition & 1 deletion ep13/src/main/java/org/teachfx/antlr4/Math.interp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ compileUnit
funcall
parameters
parameter
expr
varSlot
assign


Expand Down
6 changes: 3 additions & 3 deletions ep14/src/main/antlr4/MathExpr.g4
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ compileUnit
@init {this.symtab = symtab;} // set the parser's field
: varDelaration+;

varDelaration : vtype=type name=ID ('=' value=expr)? ';'
varDelaration : vtype=type name=ID ('=' value=varSlot)? ';'
{
BuiltIntTypeSymbol sym = (BuiltIntTypeSymbol)symtab.resolve($vtype.text);
Expand All @@ -26,13 +26,13 @@ varDelaration : vtype=type name=ID ('=' value=expr)? ';'
System.out.println($name.text+" ref to " + symtab.resolve($name.text));
}
;
expr : lhs=expr op='+' rhs=expr
varSlot : lhs=varSlot op='+' rhs=varSlot
| INT
| FLOAT
| name=ID // reference variable in an expression
{System.out.println("a2 line "+$name.getLine()+ " " + $name.text +" : ref to "+
symtab.resolve($name.text));}
| '(' expr ')'
| '(' varSlot ')'
;
type returns [Type tsym]
@after { // $start is the first tree node matched by this rule
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ WS
rule names:
compileUnit
varDelaration
expr
varSlot
type


Expand Down
26 changes: 13 additions & 13 deletions ep16/src/main/antlr4/Cymbol.g4
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ package org.teachfx.antlr4.ep16.parser;
file : (functionDecl | varDecl | statetment)+ #compilationUnit ;

varDecl
: type ID ('=' expr)? ';'
: type ID ('=' varSlot)? ';'
;
type: primaryType | ID ; // pre-defined types
primaryType: 'float' | 'int' | 'void';
Expand All @@ -23,21 +23,21 @@ block: '{' statetment* '}' ; // possibly empty statement block

statetment: block #statBlock
| varDecl #statVarDecl
| 'return' expr? ';' #statReturn
| 'if' '(' cond=expr ')' then=statetment ('else' elseDo=statetment)? #stateCondition
| 'while' '(' cond=expr ')' then=statetment #stateWhile
| expr '=' expr ';' #statAssign // assignment
| expr ';' #stat // func call
| 'return' varSlot? ';' #statReturn
| 'if' '(' cond=varSlot ')' then=statetment ('else' elseDo=statetment)? #stateCondition
| 'while' '(' cond=varSlot ')' then=statetment #stateWhile
| varSlot '=' varSlot ';' #statAssign // assignment
| varSlot ';' #stat // func call
;

expr: expr '(' ( expr (',' expr)* )? ')' #exprFuncCall // func call like f(), f(x), f(1,2)
| '-' expr #exprUnary // unary minus
| '!' expr #exprUnary // boolean not
| expr o=('*'|'/') expr #exprBinary
| expr o=('+'|'-') expr #exprBinary
| expr o=('=='|'!='|'>'|'>='|'<'|'<=') expr #exprBinary
varSlot: varSlot '(' ( varSlot (',' varSlot)* )? ')' #exprFuncCall // func call like f(), f(x), f(1,2)
| '-' varSlot #exprUnary // unary minus
| '!' varSlot #exprUnary // boolean not
| varSlot o=('*'|'/') varSlot #exprBinary
| varSlot o=('+'|'-') varSlot #exprBinary
| varSlot o=('=='|'!='|'>'|'>='|'<'|'<=') varSlot #exprBinary
| primary #exprPrimary
| '(' expr ')' #exprGroup
| '(' varSlot ')' #exprGroup
;
primary: ID #primaryID // variable reference
| INT #primaryINT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ formalParameters
formalParameter
block
statetment
expr
varSlot
primary


Expand Down
26 changes: 13 additions & 13 deletions ep17/src/main/antlr4/Cymbol.g4
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ package org.teachfx.antlr4.ep17.parser;
file : (functionDecl | varDecl | statetment)+ #compilationUnit ;

varDecl
: type ID ('=' expr)? ';'
: type ID ('=' varSlot)? ';'
;
type: primaryType | ID ; // pre-defined types
primaryType: 'float' | 'int' | 'void';
Expand All @@ -23,21 +23,21 @@ block: '{' statetment* '}' ; // possibly empty statement block

statetment: block #statBlock
| varDecl #statVarDecl
| 'return' expr? ';' #statReturn
| 'if' '(' cond=expr ')' then=statetment ('else' elseDo=statetment)? #stateCondition
| 'while' '(' cond=expr ')' then=statetment #stateWhile
| expr '=' expr ';' #statAssign // assignment
| expr ';' #stat // func call
| 'return' varSlot? ';' #statReturn
| 'if' '(' cond=varSlot ')' then=statetment ('else' elseDo=statetment)? #stateCondition
| 'while' '(' cond=varSlot ')' then=statetment #stateWhile
| varSlot '=' varSlot ';' #statAssign // assignment
| varSlot ';' #stat // func call
;

expr: ID '(' ( expr (',' expr)* )? ')' #exprFuncCall // func call like f(), f(x), f(1,2)
| '-' expr #exprUnary // unary minus
| '!' expr #exprUnary // boolean not
| expr o=('*'|'/') expr #exprBinary
| expr o=('+'|'-') expr #exprBinary
| expr o=('=='|'!='|'>'|'>='|'<'|'<=') expr #exprBinary
varSlot: ID '(' ( varSlot (',' varSlot)* )? ')' #exprFuncCall // func call like f(), f(x), f(1,2)
| '-' varSlot #exprUnary // unary minus
| '!' varSlot #exprUnary // boolean not
| varSlot o=('*'|'/') varSlot #exprBinary
| varSlot o=('+'|'-') varSlot #exprBinary
| varSlot o=('=='|'!='|'>'|'>='|'<'|'<=') varSlot #exprBinary
| primary #exprPrimary
| '(' expr ')' #exprGroup
| '(' varSlot ')' #exprGroup
;
primary: ID #primaryID // variable reference
| INT #primaryINT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ formalParameters
formalParameter
block
statetment
expr
varSlot
primary


Expand Down
32 changes: 16 additions & 16 deletions ep19/src/main/antlr4/Cymbol.g4
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ structMemeber
;

varDecl
: type ID ('=' expr)? ';'
: type ID ('=' varSlot)? ';'
;
type: primaryType | ID ; // pre-defined types
primaryType: 'float' | 'int' | 'void' | 'bool' | 'String' | 'Object';
Expand All @@ -33,24 +33,24 @@ block: '{' statetment* '}' ; // possibly empty statement block
statetment: block #statBlock
| structDecl #statStructDecl
| varDecl #statVarDecl
| 'return' expr? ';' #statReturn
| 'if' '(' cond=expr ')' then=statetment ('else' elseDo=statetment)? #stateCondition
| 'while' '(' cond=expr ')' then=statetment #stateWhile
| expr '=' expr ';' #statAssign // assignment
| expr ';' #stat // func call
| 'return' varSlot? ';' #statReturn
| 'if' '(' cond=varSlot ')' then=statetment ('else' elseDo=statetment)? #stateCondition
| 'while' '(' cond=varSlot ')' then=statetment #stateWhile
| varSlot '=' varSlot ';' #statAssign // assignment
| varSlot ';' #stat // func call
;

expr
: expr '(' ( expr (',' expr)* )? ')' # exprFuncCall
| expr o='.' expr # exprStructFieldAccess
| '-' expr # exprUnary
| '!' expr # exprUnary
| expr o=('*' | '/') expr # exprBinary
| expr o=('+' | '-') expr # exprBinary
| expr o=('!=' | '==' | '<' | '>' | '<=' | '>=') expr # exprBinary
| 'new' expr '(' (expr (',' expr)* )? ')' # exprNew // new Point()
varSlot
: varSlot '(' ( varSlot (',' varSlot)* )? ')' # exprFuncCall
| varSlot o='.' varSlot # exprStructFieldAccess
| '-' varSlot # exprUnary
| '!' varSlot # exprUnary
| varSlot o=('*' | '/') varSlot # exprBinary
| varSlot o=('+' | '-') varSlot # exprBinary
| varSlot o=('!=' | '==' | '<' | '>' | '<=' | '>=') varSlot # exprBinary
| 'new' varSlot '(' (varSlot (',' varSlot)* )? ')' # exprNew // new Point()
| primary # exprPrimary
| '(' expr ')' # exprGroup
| '(' varSlot ')' # exprGroup
;

primary: ID #primaryID // variable reference
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ formalParameters
formalParameter
block
statetment
expr
varSlot
primary


Expand Down
8 changes: 7 additions & 1 deletion ep20/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,10 @@ graph LR
- [x] 增加类型实体和相关类型处理内容
- [x] 将作用域和变量及函数的生命周期进行关联
- [x] 编译到[ep18](..%2Fep18)的VM
- [x] 扩展[ep18](..%2Fep18)的VM支持更丰富的[指令实现](../ep18/VM_Design.md)
- [x] 扩展[ep18](..%2Fep18)的VM支持更丰富的[指令实现](../ep18/VM_Design.md)
- [x] 线性化IR和CFG

### 线性化IR
我们的IR本质上是tree模式的,这样一来我们的线性化实际上延迟到了指令生成时。
但是,这样一来我们就无法进行活性分析和很多与TAC表示相关的分析(或者是我没找到
直接对栈代码做分析的例子)。因此,我要对ep20的输出code过程进行线性改造。
31 changes: 18 additions & 13 deletions ep20/src/main/java/org/teachfx/antlr4/ep20/Compiler.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import org.teachfx.antlr4.ep20.ast.ASTNode;
import org.teachfx.antlr4.ep20.ir.Prog;
import org.teachfx.antlr4.ep20.parser.CymbolLexer;
import org.teachfx.antlr4.ep20.parser.CymbolParser;
import org.teachfx.antlr4.ep20.pass.ast.CymbolASTBuilder;
import org.teachfx.antlr4.ep20.pass.cfg.ControlFlowAnalysis;
import org.teachfx.antlr4.ep20.pass.codegen.CymbolAssembler;
//import org.teachfx.antlr4.ep20.pass.ir.CymbolIRBuilder;
import org.teachfx.antlr4.ep20.pass.cfg.BasicBlock;
import org.teachfx.antlr4.ep20.pass.ir.CymbolIRBuilder;
import org.teachfx.antlr4.ep20.pass.symtab.LocalDefine;

Expand All @@ -20,6 +21,17 @@
import java.util.List;

public class Compiler {
protected static void printIRTree(List<BasicBlock> blocks) {
for (var block : blocks) {
System.out.println(block);
for (var instr : block.getStmts()) {
System.out.println(" " + instr);
}
if(!block.getSuccessors().isEmpty()) {
printIRTree(block.getSuccessors());
}
}
}

public static void main(String[] args) throws IOException {
String fileName = args.length > 0 ? args[0] : (new File("src/main/resources/t.cymbol")).getAbsolutePath();
Expand All @@ -37,17 +49,10 @@ public static void main(String[] args) throws IOException {
var irBuilder = new CymbolIRBuilder();

astRoot.accept(irBuilder);
printIRTree(irBuilder.prog.blockList);
//
// var dataFlowAnalysis = new ControlFlowAnalysis();
// irBuilder.root.accept(dataFlowAnalysis);

var dataFlowAnalysis = new ControlFlowAnalysis();

var assembler = new CymbolAssembler();

List.of(dataFlowAnalysis,assembler).forEach(irBuilder.root::accept);

System.out.println(assembler.flushCode());
var url = Compiler.class.getClassLoader().getResource("t.vm");
System.out.println(">>>=" + new File(".").getAbsolutePath());
assembler.saveToFile("src/main/resources/t.vm");
assembler.saveToFile("../ep18/src/main/resources/t.vm");
}
}
5 changes: 5 additions & 0 deletions ep20/src/main/java/org/teachfx/antlr4/ep20/ast/ASTNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,10 @@ public void dump(Dumper d) {
}

abstract protected void _dump(Dumper d);

@Override
public String toString() {
return ctx.getText();
}
}

Loading

0 comments on commit 069120b

Please sign in to comment.