Fixed != not being matched because ! was matched first. Fixed presedence for & | and relational operators
This commit is contained in:
@@ -38,12 +38,12 @@ function id(x) { return x[0]; }
|
|||||||
ternaryOperator: ['?', ':'],
|
ternaryOperator: ['?', ':'],
|
||||||
multiplicativeOperator: ['*', '/'],
|
multiplicativeOperator: ['*', '/'],
|
||||||
exponentOperator: ['^'],
|
exponentOperator: ['^'],
|
||||||
notOperator: ['!'],
|
|
||||||
additiveOperator: ['+', '-'],
|
additiveOperator: ['+', '-'],
|
||||||
andOperator: ['&', '&&'],
|
andOperator: ['&', '&&'],
|
||||||
orOperator: ['|', '||'],
|
orOperator: ['|', '||'],
|
||||||
stringDelimiters: ['\"', '\''],
|
stringDelimiters: ['\"', '\''],
|
||||||
equalityOperator: ['=', '==', '===', '!=', '!=='],
|
equalityOperator: ['=', '==', '===', '!=', '!=='],
|
||||||
|
notOperator: ['!'],
|
||||||
relationalOperator: ['>', '<', '>=', '<='],
|
relationalOperator: ['>', '<', '>=', '<='],
|
||||||
brackets: ['(', ')', '{', '}', '[', ']'],
|
brackets: ['(', ')', '{', '}', '[', ']'],
|
||||||
});
|
});
|
||||||
@@ -63,15 +63,15 @@ let ParserRules = [
|
|||||||
{"name": "ifStatement", "symbols": ["_", "equalityExpression", "_", {"literal":"?"}, "_", "equalityExpression", "_", {"literal":":"}, "_", "ifStatement"], "postprocess":
|
{"name": "ifStatement", "symbols": ["_", "equalityExpression", "_", {"literal":"?"}, "_", "equalityExpression", "_", {"literal":":"}, "_", "ifStatement"], "postprocess":
|
||||||
d => new IfNode({condition: d[1], consequent: d[5], alternative: d[9]})
|
d => new IfNode({condition: d[1], consequent: d[5], alternative: d[9]})
|
||||||
},
|
},
|
||||||
{"name": "ifStatement", "symbols": ["equalityExpression"], "postprocess": id},
|
{"name": "ifStatement", "symbols": ["orExpression"], "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": "orExpression", "symbols": ["orExpression", "_", (lexer.has("orOperator") ? {type: "orOperator"} : orOperator), "_", "andExpression"], "postprocess": d => operator(d, 'or')},
|
{"name": "orExpression", "symbols": ["orExpression", "_", (lexer.has("orOperator") ? {type: "orOperator"} : orOperator), "_", "andExpression"], "postprocess": d => operator(d, 'or')},
|
||||||
{"name": "orExpression", "symbols": ["andExpression"], "postprocess": id},
|
{"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": ["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": ["additiveExpression", "_", (lexer.has("additiveOperator") ? {type: "additiveOperator"} : additiveOperator), "_", "multiplicativeExpression"], "postprocess": d => operator(d, 'add')},
|
||||||
{"name": "additiveExpression", "symbols": ["multiplicativeExpression"], "postprocess": id},
|
{"name": "additiveExpression", "symbols": ["multiplicativeExpression"], "postprocess": id},
|
||||||
{"name": "multiplicativeExpression", "symbols": ["multiplicativeExpression", "_", (lexer.has("multiplicativeOperator") ? {type: "multiplicativeOperator"} : multiplicativeOperator), "_", "rollExpression"], "postprocess": d => operator(d, 'multiply')},
|
{"name": "multiplicativeExpression", "symbols": ["multiplicativeExpression", "_", (lexer.has("multiplicativeOperator") ? {type: "multiplicativeOperator"} : multiplicativeOperator), "_", "rollExpression"], "postprocess": d => operator(d, 'multiply')},
|
||||||
|
|||||||
@@ -36,12 +36,12 @@
|
|||||||
ternaryOperator: ['?', ':'],
|
ternaryOperator: ['?', ':'],
|
||||||
multiplicativeOperator: ['*', '/'],
|
multiplicativeOperator: ['*', '/'],
|
||||||
exponentOperator: ['^'],
|
exponentOperator: ['^'],
|
||||||
notOperator: ['!'],
|
|
||||||
additiveOperator: ['+', '-'],
|
additiveOperator: ['+', '-'],
|
||||||
andOperator: ['&', '&&'],
|
andOperator: ['&', '&&'],
|
||||||
orOperator: ['|', '||'],
|
orOperator: ['|', '||'],
|
||||||
stringDelimiters: ['\"', '\''],
|
stringDelimiters: ['\"', '\''],
|
||||||
equalityOperator: ['=', '==', '===', '!=', '!=='],
|
equalityOperator: ['=', '==', '===', '!=', '!=='],
|
||||||
|
notOperator: ['!'],
|
||||||
relationalOperator: ['>', '<', '>=', '<='],
|
relationalOperator: ['>', '<', '>=', '<='],
|
||||||
brackets: ['(', ')', '{', '}', '[', ']'],
|
brackets: ['(', ')', '{', '}', '[', ']'],
|
||||||
});
|
});
|
||||||
@@ -67,14 +67,6 @@ ifStatement ->
|
|||||||
_ equalityExpression _ "?" _ equalityExpression _ ":" _ ifStatement {%
|
_ equalityExpression _ "?" _ equalityExpression _ ":" _ ifStatement {%
|
||||||
d => new IfNode({condition: d[1], consequent: d[5], alternative: d[9]})
|
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 {% id %}
|
||||||
|
|
||||||
orExpression ->
|
orExpression ->
|
||||||
@@ -83,6 +75,14 @@ orExpression ->
|
|||||||
|
|
||||||
andExpression ->
|
andExpression ->
|
||||||
andExpression _ %andOperator _ additiveExpression {% d => operator(d, 'and') %}
|
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 {% id %}
|
||||||
|
|
||||||
additiveExpression ->
|
additiveExpression ->
|
||||||
|
|||||||
Reference in New Issue
Block a user