11import java .util .HashMap ;
2+ import java .util .List
23
34/**
45 * LLVM IR Generator from yaLcc parse tree
@@ -17,16 +18,25 @@ public class LlvmirGenerator {
1718 /** unamed variable counter (temporary value) */
1819 private int unamedVarCounter = 0 ;
1920
21+ /** label counter */
22+ private int labelCounter = 0 ;
23+
2024 public LlvmirGenerator (ParseTree parseTree ) {
2125 this .parseTree = parseTree ;
2226 this .llvmirCode = new StringBuilder ();
2327 this .var = new HashMap <>();
2428 this .unamedVarCounter = 0 ;
2529 }
2630
31+ private String newLabel () {
32+ return "label" + labelCounter ++;
33+ }
34+
2735 private void header () {
28- String header =
29- "; Generated LLVM IR code from ParserTree\n " + "Coucou <3\n " ;
36+ newline ("Generated LLVM IR code frome ParseTree\n " , 0 );
37+ newLine ("; External function declarations :" , 0 );
38+ newLine ("declare i32 @getchar () ; gets one character from stdin" , 0 );
39+ newLine ("declare i32 @putchar ( i32 ) ; writes one character to stdout" 0 );
3040 }
3141
3242 private ParseTree getCodeBranch (ParseTree treeNode ) {
@@ -80,15 +90,15 @@ private String getOrNewI32(String varName) {
8090 /** load a named var into a new unamed var. Create named var if non existant */
8191 private String loadI32 (String varName ) {
8292 String varId = getOrNewI32 (varName );
83- String unamVarId = "%" + ( unamedVarCounter ++) ;
84- newLine (unamVarId + " = load i32, i32 * " + varId , 2 );
85- return unamVarId ;
93+ String unamedVarId = "%" + unamedVarCounter ++;
94+ newLine (unamedVarId + " = load i32, i32 * " + varId , 2 );
95+ return unamedVarId ;
8696 }
8797
8898 /** store an unamed var into a named var. Create named var if non existant */
89- private void storeInNamI32 (String varName , String unamVarId ) {
99+ private void storeInNamI32 (String varName , String unamedVarId ) {
90100 String varId = getOrNewI32 (varName );
91- newLine ("store i32 " + unamVarId + ", i32* " + varId , 2 );
101+ newLine ("store i32 " + unamedVarId + ", i32* " + varId , 2 );
92102 }
93103
94104 /**
@@ -121,9 +131,50 @@ private void newInstructions(ParseTree treeNode) {
121131 }
122132 }
123133
124- private void newAssign (ParseTree treeNode ) {}
134+ private void newAssign (ParseTree treeNode ) {
135+ String varName = null ;
136+ ParseTree exprNode = null ;
137+
138+ for (ParseTree child : treeNode .getChildren ()) {
139+ if (child .getLabel ().isTerminal () && child .getLabel ().getValue () == LexicalUnit .VARNAME ) {
140+ varName = child .getLabel ().getValue ().toString ();
141+ } else if (child .getLabel ().isNonTerminal () && child .getLabel ().getValue () == NonTerminal .EXPR_ARITH ) {
142+ exprNode = child ; // TODO: generate expr and get unamed var
143+ }
144+ }
145+
146+ String varId = newExprArith (exprNode );
147+ storeInNamI32 (varName , varId );
148+ }
149+
150+
151+ private void newIf (ParseTree treeNode ) {
152+ ParseTree condNode = null ;
153+ ParseTree thenNode = null ;
154+ ParseTree elseNode = null ;
155+
156+
157+ List <ParseTree > childs = treeNode .getChildren ();
158+ for (int i = 0 ; i < childs .size (); i ++) {
159+ ParseTree child = childs .get (i );
160+ if (child .getLabel ().getValue () == NonTerminal .COND_IMPL ) {
161+ condNode = child ;
162+ } else if ( child .getLabel ().getValue () == LexicalUnit .THEN && i + 1 < childs .size ()) {
163+ thenNode = childs .get (1 + i );
164+ } else if ( child .getLabel ().getValue () == LexicalUnit .ELSE && i + 1 < childs .size ()) {
165+ elseNode = childs .get (1 + i );
166+ }
167+ }
168+
169+ String condId = newCond (condNode );
170+ String thenLabel = nextLabel ();
171+ String alseLabel = nextLabel ();
172+ String endLabel = nextLabel ();
173+
174+ line ("br i1 " + condReg + ", label %" + thennLabel + )
175+ }
176+
125177
126- private void newIf (ParseTree treeNode ) {}
127178
128179 private void newWhile (ParseTree treeNode ) {}
129180
@@ -133,5 +184,5 @@ private void newInput(ParseTree treeNode) {}
133184
134185 private void newCond (ParseTree treeNode ) {}
135186
136- private void newExprArith (ParseTree treeNode ) {}
187+ private String newExprArith (ParseTree treeNode ) {}
137188}
0 commit comments