diff --git a/app/imports/parser/grammar.js b/app/imports/parser/grammar.js index 69266b63..8e29fb16 100644 --- a/app/imports/parser/grammar.js +++ b/app/imports/parser/grammar.js @@ -41,6 +41,7 @@ function id(x) { return x[0]; } multiplicativeOperator: ['*', '/'], exponentOperator: ['^'], additiveOperator: ['+', '-'], + moduloOperator: ['%'], andOperator: ['&', '&&'], orOperator: ['|', '||'], stringDelimiters: ['\"', '\''], @@ -75,8 +76,10 @@ let ParserRules = [ {"name": "equalityExpression", "symbols": ["relationalExpression"], "postprocess": id}, {"name": "relationalExpression", "symbols": ["relationalExpression", "_", (lexer.has("relationalOperator") ? {type: "relationalOperator"} : relationalOperator), "_", "additiveExpression"], "postprocess": d => operator(d, 'relation')}, {"name": "relationalExpression", "symbols": ["additiveExpression"], "postprocess": id}, - {"name": "additiveExpression", "symbols": ["additiveExpression", "_", (lexer.has("additiveOperator") ? {type: "additiveOperator"} : additiveOperator), "_", "multiplicativeExpression"], "postprocess": d => operator(d, 'add')}, - {"name": "additiveExpression", "symbols": ["multiplicativeExpression"], "postprocess": id}, + {"name": "additiveExpression", "symbols": ["additiveExpression", "_", (lexer.has("additiveOperator") ? {type: "additiveOperator"} : additiveOperator), "_", "remainderExpression"], "postprocess": d => operator(d, 'add')}, + {"name": "additiveExpression", "symbols": ["remainderExpression"], "postprocess": id}, + {"name": "remainderExpression", "symbols": ["remainderExpression", "_", (lexer.has("moduloOperator") ? {type: "moduloOperator"} : moduloOperator), "_", "multiplicativeExpression"], "postprocess": d => operator(d, 'remainder')}, + {"name": "remainderExpression", "symbols": ["multiplicativeExpression"], "postprocess": id}, {"name": "multiplicativeExpression", "symbols": ["multiplicativeExpression", "_", (lexer.has("multiplicativeOperator") ? {type: "multiplicativeOperator"} : multiplicativeOperator), "_", "rollExpression"], "postprocess": d => operator(d, 'multiply')}, {"name": "multiplicativeExpression", "symbols": ["rollExpression"], "postprocess": id}, {"name": "rollExpression", "symbols": ["rollExpression", "_", (lexer.has("diceOperator") ? {type: "diceOperator"} : diceOperator), "_", "exponentExpression"], "postprocess": d => new RollNode({left: d[0], right: d[4]})}, diff --git a/app/imports/parser/grammar.ne b/app/imports/parser/grammar.ne index 066299ae..cd278bab 100644 --- a/app/imports/parser/grammar.ne +++ b/app/imports/parser/grammar.ne @@ -39,6 +39,7 @@ multiplicativeOperator: ['*', '/'], exponentOperator: ['^'], additiveOperator: ['+', '-'], + moduloOperator: ['%'], andOperator: ['&', '&&'], orOperator: ['|', '||'], stringDelimiters: ['\"', '\''], @@ -91,7 +92,11 @@ relationalExpression -> | additiveExpression {% id %} additiveExpression -> - additiveExpression _ %additiveOperator _ multiplicativeExpression {% d => operator(d, 'add') %} + additiveExpression _ %additiveOperator _ remainderExpression {% d => operator(d, 'add') %} +| remainderExpression {% id %} + +remainderExpression -> + remainderExpression _ %moduloOperator _ multiplicativeExpression {% d => operator(d, 'remainder') %} | multiplicativeExpression {% id %} multiplicativeExpression -> diff --git a/app/imports/parser/parseTree/OperatorNode.js b/app/imports/parser/parseTree/OperatorNode.js index e6822abf..6fe63428 100644 --- a/app/imports/parser/parseTree/OperatorNode.js +++ b/app/imports/parser/parseTree/OperatorNode.js @@ -31,6 +31,7 @@ export default class OperatorNode extends ParseNode { case '*': result = left * right; break; case '/': result = left / right; break; case '^': result = Math.pow(left, right); break; + case '%': result = left % right; break; case '&': case '&&': result = left && right; break; case '|':