📄 predict.java
字号:
/**
* according to expression number, deal with suitable stack
*
* @author shirly
* @version:1.2
*/
public class Predict {
/**
* @param n
* is the expression number according to number deal with the
* four stack
*/
public void predict(int n) {
AST currentAST;
switch (n) {
case 1:
// Program==ProgramHead ProgramBody
Parse.signStack.push(Type.ProgramBody);
Parse.signStack.push(Type.ProgramHead);
break;
case 2:
// ProgramHead= Class ID
Parse.signStack.push(Type.ID);
Parse.signStack.push(Type.CLASS);
Parse.treeStack.peek().setType(Type.ID);
Parse.treeStack.peek().isLeaf = false;
break;
case 3:
// ProgramBody=={Stmt-Sequence}
Parse.signStack.push(Type.RIGHTBig);
Parse.signStack.push(Type.Stmt_Sequence);
Parse.signStack.push(Type.LEFTBig);
break;
case 4:
// Stmt-Sequence== e
break;
case 5:
// Stmt_Sequence== stmt SemiOp Stmt_Sequence
Parse.signStack.push(Type.Stmt_Sequence);
Parse.signStack.push(Type.SemiOp);
Parse.signStack.push(Type.Stmt);
break;
case 6:
// stmt==e
Parse.treeStack.push(null);
break;
case 7:
// stmt==if_stmt
Parse.signStack.push(Type.if_stmt);
AST ifNode = new AST();
Parse.treeStack.peek().addChild(ifNode);
Parse.treeStack.push(ifNode);
break;
case 8:
// stmt== while_stmt
Parse.signStack.push(Type.while_stmt);
break;
case 9:
// stmt== assign-stmt
Parse.signStack.push(Type.assign_stmt);
break;
case 10:
// stmt== read-stmt
Parse.signStack.push(Type.read_stmt);
break;
case 11:
// stmt== write_stmt
Parse.signStack.push(Type.write_stmt);
break;
case 12:
// stmt==varDec_stmt
Parse.signStack.push(Type.varDec_stmt);
break;
case 13:
// varDec_stmt == TypeDef varIdList
Parse.signStack.push(Type.varIdList);
Parse.signStack.push(Type.TypeDef);
break;
case 14:
// TypeDef==BaseType TypeMore
Parse.signStack.push(Type.TypeMore);
Parse.signStack.push(Type.BaseType);
break;
case 15:
// BaseType== int
Parse.signStack.push(Type.INT);
currentAST = Parse.treeStack.peek();
AST intNode = new AST(Type.INT);
intNode.isLeaf = false;
currentAST.addChild(intNode);
Parse.treeStack.push(intNode);
break;
case 16:
// BaseType== real
Parse.signStack.push(Type.REAL);
currentAST = Parse.treeStack.peek();
AST realNode = new AST(Type.REAL);
realNode.isLeaf = false;
currentAST.addChild(realNode);
Parse.treeStack.push(realNode);
break;
case 17:
// TypeMore==e
break;
case 18:
// TypeMore== [Exp]
// tableLL[Type.TypeMore][-Type.LEFTMid] = 18;
Parse.signStack.push(Type.RIGHTMid);
Parse.signStack.push(Type.Exp);
Parse.signStack.push(Type.LEFTMid);
Parse.opStack.push(new AST(Type.END));
break;
case 19:
// varIdList== ID varListMore
// tableLL[Type.varIdList][-Type.ID] = 19;
Parse.signStack.push(Type.varListMore);
Parse.signStack.push(Type.ID);
currentAST = Parse.treeStack.peek();
AST id = new AST(Type.ID);
id.info = ": ID";
currentAST.addChild(id);
Parse.treeStack.push(id);
break;
case 20:
// varListMore == e
break;
case 21:
// varListMore == , varIdList
Parse.signStack.push(Type.varIdList);
Parse.signStack.push(Type.COMMA);
break;
case 22:
// read_stmt=read variable;
Parse.signStack.push(Type.variable);
Parse.signStack.push(Type.READ);
currentAST = Parse.treeStack.peek();
AST read = new AST(Type.READ);
read.isLeaf = false;
currentAST.addChild(read);
Parse.treeStack.push(read);
Parse.opStack.push(new AST(Type.END));
break;
case 23:
// write_stmt==write (Exp)
Parse.signStack.push(Type.RIGHTSmall);
Parse.signStack.push(Type.Exp);
Parse.signStack.push(Type.LEFTSmall);
Parse.signStack.push(Type.WRITE);
currentAST = Parse.treeStack.peek();
AST write = new AST(Type.WRITE);
write.isLeaf = false;
currentAST.addChild(write);
Parse.opStack.push(new AST(Type.END));
Parse.treeStack.push(write);
break;
case 24:
// assign_stmt == variable AssignOp Exp
Parse.signStack.push(Type.Exp);
Parse.signStack.push(Type.AssignOp);
Parse.signStack.push(Type.variable);
break;
case 25:
// variable = ID variMore
Parse.signStack.push(Type.variMore);
Parse.signStack.push(Type.ID);
AST idType = new AST(Type.ID);
idType.isLeaf = false;
Parse.treeStack.push(idType);
Parse.numStack.push(idType);
break;
case 26:
// variMore==e
AST idNode = Parse.treeStack.pop();
if (Parse.treeStack.peek().getType() == Type.MINUSUNI
|| Parse.treeStack.peek().getType() == Type.READ) {
Parse.treeStack.peek().addChild(idNode);
Parse.opStack.pop();
Parse.numStack.pop();
if (Parse.treeStack.peek().getType() == Type.MINUSUNI)
Parse.treeStack.pop();
}
break;
case 27:
// variMore= [Exp]
Parse.treeStack.peek().isLeaf = true;
Parse.signStack.push(Type.RIGHTMid);
Parse.signStack.push(Type.Exp);
Parse.signStack.push(Type.LEFTMid);
Parse.opStack.push(new AST(Type.END));
break;
case 28:
// if-stmt==if(TestExp){Stmt-sequence}ifMore
Parse.signStack.push(Type.ifMore);
Parse.signStack.push(Type.RIGHTBig);
Parse.signStack.push(Type.Stmt_Sequence);
Parse.signStack.push(Type.LEFTBig);
Parse.signStack.push(Type.RIGHTSmall);
Parse.signStack.push(Type.TestExp);
Parse.signStack.push(Type.LEFTSmall);
Parse.signStack.push(Type.IF);
Parse.treeStack.peek().isLeaf = false;
Parse.treeStack.peek().setType(Type.IF);
Parse.opStack.push(null);
break;
case 29:
// ifMore == e
break;
case 30:
// ifMore == else elseMore
Parse.signStack.push(Type.elseMore);
Parse.signStack.push(Type.ELSE);
AST elseNode = new AST(Type.ELSE);
elseNode.isLeaf = false;
Parse.treeStack.pop().setRight(elseNode);
Parse.treeStack.push(elseNode);
break;
case 31:
// elseMore== if-stmt
Parse.signStack.push(Type.if_stmt);
AST ifNode2 = new AST();
Parse.treeStack.pop().addChild(ifNode2);
Parse.treeStack.push(ifNode2);
break;
case 32:
// elseMore=={stmt-sequence}
Parse.signStack.push(Type.RIGHTBig);
Parse.signStack.push(Type.Stmt_Sequence);
Parse.signStack.push(Type.LEFTBig);
break;
case 33:
// while-stmt==while(TestExp){stmt-sequence}
Parse.signStack.push(Type.RIGHTBig);
Parse.signStack.push(Type.Stmt_Sequence);
Parse.signStack.push(Type.LEFTBig);
Parse.signStack.push(Type.RIGHTSmall);
Parse.signStack.push(Type.TestExp);
Parse.signStack.push(Type.LEFTSmall);
Parse.signStack.push(Type.WHILE);
AST whileNode = new AST(Type.WHILE);
whileNode.isLeaf = false;
Parse.treeStack.peek().addChild(whileNode);
Parse.treeStack.push(whileNode);
Parse.opStack.push(null);
break;
case 34:
// Exp==Term otherTerm
Parse.signStack.push(Type.otherTerm);
Parse.signStack.push(Type.Term);
break;
case 35:
int i = priosity(Parse.opStack.peek());
A: while (!Parse.opStack.isEmpty()) {
switch (i) {
case -1:// null
Parse.opStack.pop();
break A;
case 0:// Type.End
if (Parse.opStack.peek() != null)
if (Parse.numStack.peek().getType() != Type.END) {
if (Parse.opStack.peek().getType() == Type.END) {
Parse.treeStack.peek().addChild(
Parse.numStack.pop());
if (Parse.treeStack.peek().getType() == Type.INT
|| Parse.treeStack.peek().getType() == Type.REAL)
Parse.treeStack.peek().getDown().setType(
Type.Exp);
if (Parse.treeStack.peek().isLeaf
|| Parse.treeStack.peek().getType() == Type.MINUSUNI)
Parse.treeStack.pop();
Parse.opStack.pop();
i = 0;
continue A;
} else {
if (Parse.opStack.peek().getType() == Type.MINUSUNI) {
i = 5;
break;
}
}
}
break A;
case 2:// Type.LEFTSmall
Parse.opStack.pop();
if (Parse.opStack.peek() != null)
if (Parse.opStack.peek().getType() == Type.MINUSUNI) {
i = 5;
break;
}
break A;
case 5:// Type.MINUSUNI
Parse.treeStack.pop().addChild(Parse.numStack.pop());
Parse.opStack.pop();
break A;
default:
AST right = Parse.numStack.pop();
AST priNode = Parse.opStack.pop();
priNode.addChild(Parse.numStack.pop());
priNode.addChild(right);
Parse.numStack.push(priNode);
i = priosity(Parse.opStack.peek());
break;
}
}
break;
case 36:
// otherTerm == AddOp Exp
Parse.signStack.push(Type.Exp);
Parse.signStack.push(Type.AddOp);
AST addOp = new AST(Type.AddOp);
exp(addOp);
Parse.treeStack.push(addOp);
break;
case 37:
// Term == Factor otherFactor
Parse.signStack.push(Type.otherFactor);
Parse.signStack.push(Type.Factor);
break;
case 38:
// 38. otherFactor == e
break;
case 39:
// 39. otherFactor== MultiOp Term
Parse.signStack.push(Type.Term);
Parse.signStack.push(Type.MultiOp);
AST multiOp = new AST(Type.MultiOp);
exp(multiOp);
Parse.treeStack.push(multiOp);
break;
case 40:
// 40. Factor == Sign factorMore
Parse.signStack.push(Type.factorMore);
Parse.signStack.push(Type.Sign);
break;
case 41:
// 41. Factor == Num
Parse.signStack.push(Type.NUM);
AST num = new AST(Type.NUM);
Parse.numStack.push(num);
Parse.treeStack.push(num);
break;
case 42:
// 42. factorMore== (Exp)
Parse.signStack.push(Type.RIGHTSmall);
Parse.signStack.push(Type.Exp);
Parse.signStack.push(Type.LEFTSmall);
Parse.opStack.push(new AST(Type.LEFTSmall));
break;
case 43:
// 43. factorMore == variable
Parse.signStack.push(Type.variable);
break;
case 44:
// 44. Sign== e
break;
case 45:
// 45. Sign == MINUSUNI
Parse.signStack.push(Type.MINUSUNI);
AST minusuni = new AST(Type.MINUSUNI);
Parse.treeStack.push(minusuni);
minusuni.isLeaf = false;
minusuni.info = "";
Parse.numStack.push(minusuni);
Parse.opStack.push(new AST(Type.MINUSUNI));
break;
case 46:
// 46. TestExp == Exp otherExp
Parse.signStack.push(Type.otherExp);
Parse.signStack.push(Type.Exp);
break;
case 47:
// 47. otherExp == CmpOp Exp
Parse.signStack.push(Type.Exp);
Parse.signStack.push(Type.CmpOp);
AST cmpOp = new AST(Type.CmpOp);
Parse.opStack.push(new AST(Type.END));
exp(cmpOp);
Parse.treeStack.push(cmpOp);
break;
case 48:
// 48. AddOp == +
Parse.signStack.push(Type.ADD);
Parse.treeStack.peek().setType(Type.ADD);
break;
case 49:
// 49. AddOp== MINUSBI
Parse.signStack.push(Type.MINUSBI);
Parse.treeStack.peek().setType(Type.MINUSBI);
break;
case 50:
// 50. MultiOp == *
Parse.signStack.push(Type.MULTI);
Parse.treeStack.peek().setType(Type.MULTI);
break;
case 51:
// 51. MultiOp== /
Parse.signStack.push(Type.DIVID);
Parse.treeStack.peek().setType(Type.DIVID);
break;
case 52:
// 52. CmpOp == <
Parse.signStack.push(Type.LESS);
Parse.treeStack.peek().setType(Type.LESS);
break;
case 53:
// 53. CmpOp == >
Parse.signStack.push(Type.BIGGER);
Parse.treeStack.peek().setType(Type.BIGGER);
break;
case 54:
// 54. CmpOp == <>
Parse.signStack.push(Type.NOTEQUAL);
Parse.treeStack.peek().setType(Type.NOTEQUAL);
break;
case 55:
// 55. CmpOp == ==
Parse.signStack.push(Type.EQUAL);
Parse.treeStack.peek().setType(Type.EQUAL);
break;
case 56:
// 56 AssignOp == =
Parse.signStack.push(Type.ASSIGN);
AST assign = new AST(Type.ASSIGN);
assign.isLeaf = false;
assign.info = ": assign-stmt";
assign.addChild(Parse.numStack.pop());
Parse.treeStack.peek().addChild(assign);
Parse.treeStack.push(assign);
Parse.opStack.push(new AST(Type.END));
break;
case 57:
// 57:SemiOp == ;
Parse.signStack.push(Type.SEMI);
Parse.treeStack.pop();
default:
break;
}
}
/**
* @param node
* @according to the type of the node, return the priosity of the node
*/
private int priosity(AST node) {
if (node == null)
return -1;
switch (node.getType()) {
case Type.END:
return 0;
case Type.LESS:
case Type.BIGGER:
case Type.NOTEQUAL:
case Type.EQUAL:
case Type.CmpOp:
return 1;
case Type.LEFTSmall:
return 2;
case Type.ADD:
case Type.MINUSBI:
case Type.AddOp:
return 3;
case Type.MULTI:
case Type.DIVID:
case Type.MultiOp:
return 4;
case Type.MINUSUNI:
return 5;
default:
return -1;
}
}
/**
* if parameter2 > =parameter1,return false; if parameter2<parameter1,return
* true;
*/
private boolean comparePri(AST node1, AST node2) {
if (priosity(node1) > priosity(node2)) {
return true;
} else
return false;
}
/**
* @param node
* if the priosity of the node is bigger than the top node of the
* treeStack,push it to the Stack! else pop the top two node from
* the numStack, and let the two node as the child of the top
* node of the opStack
*/
private void exp(AST node) {
if (comparePri(node, Parse.opStack.peek())) {
Parse.opStack.push(node);
} else {
while (!comparePri(node, Parse.opStack.peek())) {
AST right = Parse.numStack.pop();
AST priNode = Parse.opStack.pop();
priNode.addChild(Parse.numStack.pop());
priNode.addChild(right);
Parse.numStack.push(priNode);
}
Parse.opStack.push(node);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -