Fixed != not being matched because ! was matched first. Fixed presedence for & | and relational operators

This commit is contained in:
Stefan Zermatten
2020-11-12 13:45:14 +02:00
parent 9941d91bb8
commit 005bc162cb
2 changed files with 16 additions and 16 deletions

View File

@@ -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')},

View File

@@ -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 ->