llvmir some opt
This commit is contained in:
50
frontend/ast/exp/RelExp.java
Normal file
50
frontend/ast/exp/RelExp.java
Normal file
@@ -0,0 +1,50 @@
|
||||
package frontend.ast.exp;
|
||||
|
||||
import frontend.ast.Node;
|
||||
import frontend.ast.NodeStack;
|
||||
import frontend.ast.SyntaxType;
|
||||
import frontend.lexer.TokenStream;
|
||||
import frontend.lexer.TokenType;
|
||||
import frontend.ast.token.TokenNode;
|
||||
import error.Errors;
|
||||
|
||||
public class RelExp extends Node {
|
||||
public RelExp(TokenStream ts) {
|
||||
super(SyntaxType.REL_EXP, ts);
|
||||
}
|
||||
|
||||
public void parse(Errors errors) {
|
||||
NodeStack stack = new NodeStack();
|
||||
while (true) {
|
||||
AddExp addexp = new AddExp(this.ts);
|
||||
addexp.parse(errors);
|
||||
stack.push(addexp);
|
||||
if (isRelOp()) {
|
||||
stack.push(new TokenNode(ts)); // relop
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (stack.size() == 1) {
|
||||
this.addChild((AddExp)stack.pop());
|
||||
} else {
|
||||
RelExp temp = this;
|
||||
while(stack.size() > 1) {
|
||||
RelExp rexp = new RelExp(this.ts);
|
||||
AddExp addexp = (AddExp)stack.pop();
|
||||
TokenNode relop = (TokenNode)stack.pop();
|
||||
temp.addChild(rexp);
|
||||
temp.addChild(relop);
|
||||
temp.addChild(addexp);
|
||||
temp = rexp;
|
||||
}
|
||||
temp.addChild((AddExp)stack.pop());
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isRelOp() {
|
||||
TokenType t = getCurrToken().getType();
|
||||
return t == TokenType.LSS || t == TokenType.GRE
|
||||
|| t == TokenType.LEQ || t == TokenType.GEQ;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user