[06 - Top Down Parser] Fix "program1*" tests except "program18ExprAll"

This commit is contained in:
2020-05-13 11:52:42 +02:00
parent ccb3ac17ca
commit 9b8fc290ad
2 changed files with 29 additions and 36 deletions

View File

@@ -138,7 +138,7 @@ public class XParser {
if ((id = parseToken(Token.ID)) != null if ((id = parseToken(Token.ID)) != null
&& (assign = parseToken(Token.ASSIGN)) != null && (assign = parseToken(Token.ASSIGN)) != null
&& (numExpr = parseNumExpr0()) != null) { && (numExpr = parseNumExpr()) != null) {
tree.addLastChild(id); tree.addLastChild(id);
tree.addLastChild(assign); tree.addLastChild(assign);
tree.addLastChild(numExpr); tree.addLastChild(numExpr);
@@ -149,75 +149,60 @@ public class XParser {
return null; return null;
} }
private Tree parseNumExpr0() { private Tree parseNumExpr() {
int oldPosition = in.getPosition(); int oldPosition = in.getPosition();
Tree tree = new Tree(new Token(Token.EXPR)); Tree tree = new Tree(new Token(Token.EXPR));
Tree intConst, a, operator, b; Tree a, b, operator;
if ((intConst = parseNumExpr2()) != null) {
tree.addLastChild(intConst);
return tree;
}
in.setPosition(oldPosition);
if (((a = parseNumExpr2()) != null) if (((a = parseNumExpr2()) != null)
&& ((operator = parseToken(Token.MULT)) != null && (((operator = parseToken(Token.PLUS)) != null
|| ((operator = parseToken(Token.DIV)) != null || (operator = parseToken(Token.MINUS)) != null))
|| ((operator = parseToken(Token.PLUS)) != null && (b = parseNumExpr()) != null) {
|| ((operator = parseToken(Token.MINUS)) != null))))
&& ((b = parseNumExpr()) != null)) {
tree.addLastChild(a); tree.addLastChild(a);
tree.addLastChild(operator); tree.addLastChild(operator);
tree.addLastChild(b); tree.addLastChild(b);
return tree; return tree;
} }
in.setPosition(oldPosition); in.setPosition(oldPosition);
return null;
}
private Tree parseNumExpr() { if ((a = parseNumExpr2()) != null) {
int oldPosition = in.getPosition(); tree.addLastChild(a);
Tree tree = new Tree(new Token(Token.EXPR));
Tree id, intConst;
if ((intConst = parseNumExpr2()) != null) {
tree.addLastChild(intConst);
return tree; return tree;
} }
if ((id = parseToken(Token.ID)) != null) {
tree.addLastChild(id);
return tree;
}
in.setPosition(oldPosition); in.setPosition(oldPosition);
return null; return null;
} }
private Tree parseNumExpr2() { private Tree parseNumExpr2() {
int oldPosition = in.getPosition(); int oldPosition = in.getPosition();
Tree tree = new Tree(new Token(Token.EXPR2)); Tree tree = new Tree(new Token(Token.EXPR2));
Tree id, intConst; Tree a, b, operator;
if ((intConst = parseNumExpr3()) != null) { if (((a = parseNumExpr3()) != null)
tree.addLastChild(intConst); && (((operator = parseToken(Token.MULT)) != null
|| (operator = parseToken(Token.DIV)) != null))
&& (b = parseNumExpr2()) != null) {
tree.addLastChild(a);
tree.addLastChild(operator);
tree.addLastChild(b);
return tree; return tree;
} }
in.setPosition(oldPosition); in.setPosition(oldPosition);
if ((id = parseToken(Token.ID)) != null) { if ((a = parseNumExpr3()) != null) {
tree.addLastChild(id); tree.addLastChild(a);
return tree; return tree;
} }
in.setPosition(oldPosition); in.setPosition(oldPosition);
return null; return null;
} }
private Tree parseNumExpr3() { private Tree parseNumExpr3() {
int oldPosition = in.getPosition(); int oldPosition = in.getPosition();
Tree tree = new Tree(new Token(Token.EXPR3)); Tree tree = new Tree(new Token(Token.EXPR3));
Tree id, intConst; Tree sign, intConst, id, num, lbr, rbr;
if ((intConst = parseToken(Token.INTCONST)) != null) { if ((intConst = parseToken(Token.INTCONST)) != null) {
tree.addLastChild(intConst); tree.addLastChild(intConst);
@@ -225,6 +210,14 @@ public class XParser {
} }
in.setPosition(oldPosition); in.setPosition(oldPosition);
if (((sign = parseToken(Token.MINUS)) != null
&& ((intConst = parseToken(Token.INTCONST))) != null)) {
tree.addLastChild(sign);
tree.addLastChild(intConst);
return tree;
}
in.setPosition(oldPosition);
if ((id = parseToken(Token.ID)) != null) { if ((id = parseToken(Token.ID)) != null) {
tree.addLastChild(id); tree.addLastChild(id);
return tree; return tree;