Skip to content

Commit 8530342

Browse files
committed
if
1 parent acf1bd3 commit 8530342

1 file changed

Lines changed: 61 additions & 10 deletions

File tree

src/LlvmirGenerator.java

Lines changed: 61 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 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

Comments
 (0)