diff --git a/app/imports/parser/grammar.js b/app/imports/parser/grammar.js index c1672285..f58d5bff 100644 --- a/app/imports/parser/grammar.js +++ b/app/imports/parser/grammar.js @@ -38,12 +38,12 @@ function id(x) { return x[0]; } ternaryOperator: ['?', ':'], multiplicativeOperator: ['*', '/'], exponentOperator: ['^'], - notOperator: ['!'], additiveOperator: ['+', '-'], andOperator: ['&', '&&'], orOperator: ['|', '||'], stringDelimiters: ['\"', '\''], equalityOperator: ['=', '==', '===', '!=', '!=='], + notOperator: ['!'], relationalOperator: ['>', '<', '>=', '<='], brackets: ['(', ')', '{', '}', '[', ']'], }); @@ -63,15 +63,15 @@ let ParserRules = [ {"name": "ifStatement", "symbols": ["_", "equalityExpression", "_", {"literal":"?"}, "_", "equalityExpression", "_", {"literal":":"}, "_", "ifStatement"], "postprocess": d => new IfNode({condition: d[1], consequent: d[5], alternative: d[9]}) }, - {"name": "ifStatement", "symbols": ["equalityExpression"], "postprocess": id}, - {"name": "equalityExpression", "symbols": ["equalityExpression", "_", (lexer.has("equalityOperator") ? {type: "equalityOperator"} : equalityOperator), "_", "relationalExpression"], "postprocess": d => operator(d, 'equality')}, - {"name": "equalityExpression", "symbols": ["relationalExpression"], "postprocess": id}, - {"name": "relationalExpression", "symbols": ["relationalExpression", "_", (lexer.has("relationalOperator") ? {type: "relationalOperator"} : relationalOperator), "_", "orExpression"], "postprocess": d => operator(d, 'relation')}, - {"name": "relationalExpression", "symbols": ["orExpression"], "postprocess": id}, + {"name": "ifStatement", "symbols": ["orExpression"], "postprocess": id}, {"name": "orExpression", "symbols": ["orExpression", "_", (lexer.has("orOperator") ? {type: "orOperator"} : orOperator), "_", "andExpression"], "postprocess": d => operator(d, 'or')}, {"name": "orExpression", "symbols": ["andExpression"], "postprocess": id}, {"name": "andExpression", "symbols": ["andExpression", "_", (lexer.has("andOperator") ? {type: "andOperator"} : andOperator), "_", "additiveExpression"], "postprocess": d => operator(d, 'and')}, - {"name": "andExpression", "symbols": ["additiveExpression"], "postprocess": id}, + {"name": "andExpression", "symbols": ["equalityExpression"], "postprocess": id}, + {"name": "equalityExpression", "symbols": ["equalityExpression", "_", (lexer.has("equalityOperator") ? {type: "equalityOperator"} : equalityOperator), "_", "relationalExpression"], "postprocess": d => operator(d, 'equality')}, + {"name": "equalityExpression", "symbols": ["relationalExpression"], "postprocess": id}, + {"name": "relationalExpression", "symbols": ["relationalExpression", "_", (lexer.has("relationalOperator") ? {type: "relationalOperator"} : relationalOperator), "_", "orExpression"], "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": "multiplicativeExpression", "symbols": ["multiplicativeExpression", "_", (lexer.has("multiplicativeOperator") ? {type: "multiplicativeOperator"} : multiplicativeOperator), "_", "rollExpression"], "postprocess": d => operator(d, 'multiply')}, diff --git a/app/imports/parser/grammar.ne b/app/imports/parser/grammar.ne index 7f768c39..57e27ced 100644 --- a/app/imports/parser/grammar.ne +++ b/app/imports/parser/grammar.ne @@ -36,12 +36,12 @@ ternaryOperator: ['?', ':'], multiplicativeOperator: ['*', '/'], exponentOperator: ['^'], - notOperator: ['!'], additiveOperator: ['+', '-'], andOperator: ['&', '&&'], orOperator: ['|', '||'], stringDelimiters: ['\"', '\''], equalityOperator: ['=', '==', '===', '!=', '!=='], + notOperator: ['!'], relationalOperator: ['>', '<', '>=', '<='], brackets: ['(', ')', '{', '}', '[', ']'], }); @@ -67,14 +67,6 @@ ifStatement -> _ equalityExpression _ "?" _ equalityExpression _ ":" _ ifStatement {% d => new IfNode({condition: d[1], consequent: d[5], alternative: d[9]}) %} -| equalityExpression {% id %} - -equalityExpression -> - equalityExpression _ %equalityOperator _ relationalExpression {% d => operator(d, 'equality') %} -| relationalExpression {% id %} - -relationalExpression -> - relationalExpression _ %relationalOperator _ orExpression {% d => operator(d, 'relation') %} | orExpression {% id %} orExpression -> @@ -83,6 +75,14 @@ orExpression -> andExpression -> andExpression _ %andOperator _ additiveExpression {% d => operator(d, 'and') %} +| equalityExpression {% id %} + +equalityExpression -> + equalityExpression _ %equalityOperator _ relationalExpression {% d => operator(d, 'equality') %} +| relationalExpression {% id %} + +relationalExpression -> + relationalExpression _ %relationalOperator _ orExpression {% d => operator(d, 'relation') %} | additiveExpression {% id %} additiveExpression ->