|
@@ -786,27 +786,27 @@ export class IVProgParser {
|
|
|
* term => literal || arrayAccess || FuncCall || ID || '('EAnd')'
|
|
|
**/
|
|
|
parseExpressionOR () {
|
|
|
- const exp1 = this.parseExpressionAND();
|
|
|
- const maybeAnd = this.getToken();
|
|
|
- if (maybeAnd.type === this.lexerClass.OR_OPERATOR) {
|
|
|
+ let exp1 = this.parseExpressionAND();
|
|
|
+ while (this.getToken().type === this.lexerClass.OR_OPERATOR) {
|
|
|
this.pos++;
|
|
|
const or = convertFromString('or');
|
|
|
this.consumeNewLines();
|
|
|
- const exp2 = this.parseExpressionOR();
|
|
|
- return new Expressions.InfixApp(or, exp1, exp2);
|
|
|
+ const exp2 = this.parseExpressionAND();
|
|
|
+ const finalExp = new Expressions.InfixApp(or, exp1, exp2);
|
|
|
+ exp1 = finalExp
|
|
|
}
|
|
|
return exp1;
|
|
|
}
|
|
|
|
|
|
parseExpressionAND () {
|
|
|
- const exp1 = this.parseExpressionNot();
|
|
|
- const andToken = this.getToken();
|
|
|
- if (andToken.type === this.lexerClass.AND_OPERATOR) {
|
|
|
+ let exp1 = this.parseExpressionNot();
|
|
|
+ while (this.getToken().type === this.lexerClass.AND_OPERATOR) {
|
|
|
this.pos++;
|
|
|
const and = convertFromString('and');
|
|
|
this.consumeNewLines();
|
|
|
- const exp2 = this.parseExpressionAND();
|
|
|
- return new Expressions.InfixApp(and, exp1, exp2);
|
|
|
+ const exp2 = this.parseExpressionNot();
|
|
|
+ const finalExp = new Expressions.InfixApp(and, exp1, exp2);
|
|
|
+ exp1 = finalExp;
|
|
|
}
|
|
|
return exp1;
|
|
|
}
|
|
@@ -824,37 +824,40 @@ export class IVProgParser {
|
|
|
}
|
|
|
|
|
|
parseExpressionRel () {
|
|
|
- const exp1 = this.parseExpression();
|
|
|
- const relToken = this.getToken();
|
|
|
- if(relToken.type === this.lexerClass.RELATIONAL_OPERATOR) {
|
|
|
+ let exp1 = this.parseExpression();
|
|
|
+ while (this.getToken().type === this.lexerClass.RELATIONAL_OPERATOR) {
|
|
|
+ const relToken = this.getToken();
|
|
|
this.pos++;
|
|
|
- const rel = convertFromString(relToken.text); // TODO: source code line/column information
|
|
|
+ const rel = convertFromString(relToken.text);
|
|
|
const exp2 = this.parseExpression();
|
|
|
- return new Expressions.InfixApp(rel, exp1, exp2);
|
|
|
+ const finalExp = new Expressions.InfixApp(rel, exp1, exp2);
|
|
|
+ exp1 = finalExp;
|
|
|
}
|
|
|
return exp1;
|
|
|
}
|
|
|
|
|
|
parseExpression () {
|
|
|
- const factor = this.parseFactor();
|
|
|
- const sumOpToken = this.getToken();
|
|
|
- if(sumOpToken.type === this.lexerClass.SUM_OP) {
|
|
|
+ let factor = this.parseFactor();
|
|
|
+ while (this.getToken().type === this.lexerClass.SUM_OP) {
|
|
|
+ const sumOpToken = this.getToken();
|
|
|
this.pos++;
|
|
|
- const op = convertFromString(sumOpToken.text); // TODO: source code line/column information
|
|
|
- const exp = this.parseExpression();
|
|
|
- return new Expressions.InfixApp(op, factor, exp);
|
|
|
+ const op = convertFromString(sumOpToken.text);
|
|
|
+ const factor2 = this.parseFactor();
|
|
|
+ const finalExp = new Expressions.InfixApp(op, factor, factor2);
|
|
|
+ factor = finalExp;
|
|
|
}
|
|
|
return factor;
|
|
|
}
|
|
|
|
|
|
parseFactor () {
|
|
|
- const term = this.parseTerm();
|
|
|
- const multOpToken = this.getToken();
|
|
|
- if(multOpToken.type === this.lexerClass.MULTI_OP) {
|
|
|
- this.pos++;
|
|
|
- const op = convertFromString(multOpToken.text); // TODO: source code line/column information
|
|
|
- const factor = this.parseFactor();
|
|
|
- return new Expressions.InfixApp(op, term, factor);
|
|
|
+ let term = this.parseTerm();
|
|
|
+ while (this.getToken().type === this.lexerClass.MULTI_OP) {
|
|
|
+ const multOpToken = this.getToken();
|
|
|
+ this.pos++;
|
|
|
+ const op = convertFromString(multOpToken.text);
|
|
|
+ const term2 =this.parseTerm();
|
|
|
+ const finalExp = new Expressions.InfixApp(op, term, term2);
|
|
|
+ term = finalExp;
|
|
|
}
|
|
|
return term;
|
|
|
}
|