mips without optimize
This commit is contained in:
146
frontend/ast/exp/AddExp.java
Normal file → Executable file
146
frontend/ast/exp/AddExp.java
Normal file → Executable file
@@ -1,73 +1,73 @@
|
||||
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 midend.symbol.SymbolManager;
|
||||
import error.Errors;
|
||||
|
||||
public class AddExp extends Node {
|
||||
public AddExp(TokenStream ts) {
|
||||
super(SyntaxType.ADD_EXP, ts);
|
||||
}
|
||||
|
||||
public void parse(Errors errors) {
|
||||
NodeStack stack = new NodeStack();
|
||||
while (true) {
|
||||
MulExp mep = new MulExp(this.ts);
|
||||
mep.parse(errors);
|
||||
stack.push(mep);
|
||||
if (isAddOp()) {
|
||||
stack.push(new TokenNode(ts)); // addop
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (stack.size() == 1) {
|
||||
this.addChild((MulExp) stack.pop());
|
||||
} else {
|
||||
AddExp temp = this;
|
||||
while (stack.size() > 1) {
|
||||
AddExp ae = new AddExp(this.ts);
|
||||
MulExp mep = (MulExp) stack.pop();
|
||||
TokenNode op = (TokenNode) stack.pop();
|
||||
temp.addChild(ae);
|
||||
temp.addChild(op);
|
||||
temp.addChild(mep);
|
||||
temp = ae;
|
||||
}
|
||||
temp.addChild((MulExp) stack.pop());
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isAddOp() {
|
||||
TokenType t = getCurrToken().getType();
|
||||
return t == TokenType.PLUS || t == TokenType.MINU;
|
||||
}
|
||||
|
||||
public int getType() {
|
||||
if (getChildren().size() == 1) {
|
||||
return ((MulExp) getChild(0)).getType();
|
||||
} else {
|
||||
return ((AddExp) getChild(0)).getType()
|
||||
| ((MulExp) getChild(2)).getType();
|
||||
}
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
if (getChild(0) instanceof MulExp) {
|
||||
return ((MulExp) getChild(0)).getValue();
|
||||
} else {
|
||||
int left = ((AddExp) getChild(0)).getValue();
|
||||
int right = ((MulExp) getChild(2)).getValue();
|
||||
if (((TokenNode) getChild(1)).getType() == TokenType.PLUS) {
|
||||
return left + right;
|
||||
} else {
|
||||
return left - right;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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 midend.symbol.SymbolManager;
|
||||
import error.Errors;
|
||||
|
||||
public class AddExp extends Node {
|
||||
public AddExp(TokenStream ts) {
|
||||
super(SyntaxType.ADD_EXP, ts);
|
||||
}
|
||||
|
||||
public void parse(Errors errors) {
|
||||
NodeStack stack = new NodeStack();
|
||||
while (true) {
|
||||
MulExp mep = new MulExp(this.ts);
|
||||
mep.parse(errors);
|
||||
stack.push(mep);
|
||||
if (isAddOp()) {
|
||||
stack.push(new TokenNode(ts)); // addop
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (stack.size() == 1) {
|
||||
this.addChild((MulExp) stack.pop());
|
||||
} else {
|
||||
AddExp temp = this;
|
||||
while (stack.size() > 1) {
|
||||
AddExp ae = new AddExp(this.ts);
|
||||
MulExp mep = (MulExp) stack.pop();
|
||||
TokenNode op = (TokenNode) stack.pop();
|
||||
temp.addChild(ae);
|
||||
temp.addChild(op);
|
||||
temp.addChild(mep);
|
||||
temp = ae;
|
||||
}
|
||||
temp.addChild((MulExp) stack.pop());
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isAddOp() {
|
||||
TokenType t = getCurrToken().getType();
|
||||
return t == TokenType.PLUS || t == TokenType.MINU;
|
||||
}
|
||||
|
||||
public int getType() {
|
||||
if (getChildren().size() == 1) {
|
||||
return ((MulExp) getChild(0)).getType();
|
||||
} else {
|
||||
return ((AddExp) getChild(0)).getType()
|
||||
| ((MulExp) getChild(2)).getType();
|
||||
}
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
if (getChild(0) instanceof MulExp) {
|
||||
return ((MulExp) getChild(0)).getValue();
|
||||
} else {
|
||||
int left = ((AddExp) getChild(0)).getValue();
|
||||
int right = ((MulExp) getChild(2)).getValue();
|
||||
if (((TokenNode) getChild(1)).getType() == TokenType.PLUS) {
|
||||
return left + right;
|
||||
} else {
|
||||
return left - right;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user