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: ['?', ':'],
|
||||
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')},
|
||||
|
||||
@@ -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 ->
|
||||
|
||||
Reference in New Issue
Block a user