Added modulo operator

This commit is contained in:
Stefan Zermatten
2021-02-03 09:33:00 +02:00
parent f9f0186d95
commit 9ff096ec0f
3 changed files with 12 additions and 3 deletions

View File

@@ -41,6 +41,7 @@ function id(x) { return x[0]; }
multiplicativeOperator: ['*', '/'], multiplicativeOperator: ['*', '/'],
exponentOperator: ['^'], exponentOperator: ['^'],
additiveOperator: ['+', '-'], additiveOperator: ['+', '-'],
moduloOperator: ['%'],
andOperator: ['&', '&&'], andOperator: ['&', '&&'],
orOperator: ['|', '||'], orOperator: ['|', '||'],
stringDelimiters: ['\"', '\''], stringDelimiters: ['\"', '\''],
@@ -75,8 +76,10 @@ let ParserRules = [
{"name": "equalityExpression", "symbols": ["relationalExpression"], "postprocess": id}, {"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": ["relationalExpression", "_", (lexer.has("relationalOperator") ? {type: "relationalOperator"} : relationalOperator), "_", "additiveExpression"], "postprocess": d => operator(d, 'relation')},
{"name": "relationalExpression", "symbols": ["additiveExpression"], "postprocess": id}, {"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), "_", "remainderExpression"], "postprocess": d => operator(d, 'add')},
{"name": "additiveExpression", "symbols": ["multiplicativeExpression"], "postprocess": id}, {"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": ["multiplicativeExpression", "_", (lexer.has("multiplicativeOperator") ? {type: "multiplicativeOperator"} : multiplicativeOperator), "_", "rollExpression"], "postprocess": d => operator(d, 'multiply')},
{"name": "multiplicativeExpression", "symbols": ["rollExpression"], "postprocess": id}, {"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]})}, {"name": "rollExpression", "symbols": ["rollExpression", "_", (lexer.has("diceOperator") ? {type: "diceOperator"} : diceOperator), "_", "exponentExpression"], "postprocess": d => new RollNode({left: d[0], right: d[4]})},

View File

@@ -39,6 +39,7 @@
multiplicativeOperator: ['*', '/'], multiplicativeOperator: ['*', '/'],
exponentOperator: ['^'], exponentOperator: ['^'],
additiveOperator: ['+', '-'], additiveOperator: ['+', '-'],
moduloOperator: ['%'],
andOperator: ['&', '&&'], andOperator: ['&', '&&'],
orOperator: ['|', '||'], orOperator: ['|', '||'],
stringDelimiters: ['\"', '\''], stringDelimiters: ['\"', '\''],
@@ -91,7 +92,11 @@ relationalExpression ->
| additiveExpression {% id %} | additiveExpression {% id %}
additiveExpression -> 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 {% id %}
multiplicativeExpression -> multiplicativeExpression ->

View File

@@ -31,6 +31,7 @@ export default class OperatorNode extends ParseNode {
case '*': result = left * right; break; case '*': result = left * right; break;
case '/': result = left / right; break; case '/': result = left / right; break;
case '^': result = Math.pow(left, right); break; case '^': result = Math.pow(left, right); break;
case '%': result = left % right; break;
case '&': case '&':
case '&&': result = left && right; break; case '&&': result = left && right; break;
case '|': case '|':