mips without optimize
This commit is contained in:
150
frontend/ast/exp/MulExp.java
Normal file → Executable file
150
frontend/ast/exp/MulExp.java
Normal file → Executable file
@@ -1,75 +1,75 @@
|
||||
package frontend.ast.exp;
|
||||
|
||||
import frontend.ast.Node;
|
||||
import frontend.ast.SyntaxType;
|
||||
import frontend.lexer.TokenStream;
|
||||
import frontend.lexer.TokenType;
|
||||
import frontend.ast.token.TokenNode;
|
||||
import frontend.ast.NodeStack;
|
||||
import midend.symbol.SymbolManager;
|
||||
import error.Errors;
|
||||
|
||||
public class MulExp extends Node {
|
||||
public MulExp(TokenStream ts) {
|
||||
super(SyntaxType.MUL_EXP, ts);
|
||||
}
|
||||
|
||||
public void parse(Errors errors) {
|
||||
NodeStack stack = new NodeStack();
|
||||
while (true) {
|
||||
UnaryExp uep = new UnaryExp(this.ts);
|
||||
uep.parse(errors);
|
||||
stack.push(uep);
|
||||
if (isMulOp()) {
|
||||
stack.push(new TokenNode(ts)); // mulop
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (stack.size() == 1) {
|
||||
addChild((UnaryExp)stack.pop());
|
||||
} else {
|
||||
MulExp temp = this;
|
||||
while (stack.size() > 1) {
|
||||
MulExp mep = new MulExp(this.ts);
|
||||
UnaryExp uep = (UnaryExp) stack.pop();
|
||||
TokenNode mulop = (TokenNode) stack.pop();
|
||||
temp.addChild(mep);
|
||||
temp.addChild(mulop);
|
||||
temp.addChild(uep);
|
||||
temp = mep;
|
||||
}
|
||||
temp.addChild((UnaryExp)stack.pop());
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isMulOp() {
|
||||
TokenType t = getCurrToken().getType();
|
||||
return t == TokenType.MULT || t == TokenType.DIV || t == TokenType.MOD;
|
||||
}
|
||||
|
||||
public int getType() {
|
||||
if (getChildren().size() == 1) {
|
||||
return ((UnaryExp) getChild(0)).getType();
|
||||
} else {
|
||||
return ((MulExp) getChild(0)).getType()
|
||||
| ((UnaryExp) getChild(2)).getType();
|
||||
}
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
if (getChild(0) instanceof UnaryExp) {
|
||||
return ((UnaryExp) getChild(0)).getValue();
|
||||
} else {
|
||||
int left = ((MulExp) getChild(0)).getValue();
|
||||
int right = ((UnaryExp) getChild(2)).getValue();
|
||||
if (((TokenNode) getChild(1)).getType() == TokenType.MULT) {
|
||||
return left * right;
|
||||
} else if (((TokenNode) getChild(1)).getType() == TokenType.DIV) {
|
||||
return left / right;
|
||||
} else {
|
||||
return left % right;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
package frontend.ast.exp;
|
||||
|
||||
import frontend.ast.Node;
|
||||
import frontend.ast.SyntaxType;
|
||||
import frontend.lexer.TokenStream;
|
||||
import frontend.lexer.TokenType;
|
||||
import frontend.ast.token.TokenNode;
|
||||
import frontend.ast.NodeStack;
|
||||
import midend.symbol.SymbolManager;
|
||||
import error.Errors;
|
||||
|
||||
public class MulExp extends Node {
|
||||
public MulExp(TokenStream ts) {
|
||||
super(SyntaxType.MUL_EXP, ts);
|
||||
}
|
||||
|
||||
public void parse(Errors errors) {
|
||||
NodeStack stack = new NodeStack();
|
||||
while (true) {
|
||||
UnaryExp uep = new UnaryExp(this.ts);
|
||||
uep.parse(errors);
|
||||
stack.push(uep);
|
||||
if (isMulOp()) {
|
||||
stack.push(new TokenNode(ts)); // mulop
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (stack.size() == 1) {
|
||||
addChild((UnaryExp)stack.pop());
|
||||
} else {
|
||||
MulExp temp = this;
|
||||
while (stack.size() > 1) {
|
||||
MulExp mep = new MulExp(this.ts);
|
||||
UnaryExp uep = (UnaryExp) stack.pop();
|
||||
TokenNode mulop = (TokenNode) stack.pop();
|
||||
temp.addChild(mep);
|
||||
temp.addChild(mulop);
|
||||
temp.addChild(uep);
|
||||
temp = mep;
|
||||
}
|
||||
temp.addChild((UnaryExp)stack.pop());
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isMulOp() {
|
||||
TokenType t = getCurrToken().getType();
|
||||
return t == TokenType.MULT || t == TokenType.DIV || t == TokenType.MOD;
|
||||
}
|
||||
|
||||
public int getType() {
|
||||
if (getChildren().size() == 1) {
|
||||
return ((UnaryExp) getChild(0)).getType();
|
||||
} else {
|
||||
return ((MulExp) getChild(0)).getType()
|
||||
| ((UnaryExp) getChild(2)).getType();
|
||||
}
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
if (getChild(0) instanceof UnaryExp) {
|
||||
return ((UnaryExp) getChild(0)).getValue();
|
||||
} else {
|
||||
int left = ((MulExp) getChild(0)).getValue();
|
||||
int right = ((UnaryExp) getChild(2)).getValue();
|
||||
if (((TokenNode) getChild(1)).getType() == TokenType.MULT) {
|
||||
return left * right;
|
||||
} else if (((TokenNode) getChild(1)).getType() == TokenType.DIV) {
|
||||
return left / right;
|
||||
} else {
|
||||
return left % right;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user