diff --git a/app/imports/parser/grammar.js b/app/imports/parser/grammar.js index 27669cea..cd0bf939 100644 --- a/app/imports/parser/grammar.js +++ b/app/imports/parser/grammar.js @@ -24,15 +24,16 @@ function id(x) { return x[0]; } value: s => s.slice(1, -1), }, name: { - match: /[a-zA-Z_]+/, + match: /[a-zA-Z_]*[a-ce-zA-Z_][a-zA-Z0-9_]*/, type: moo.keywords({ - 'keywords': ['d', 'true', 'false'], + 'keywords': ['true', 'false'], }), }, space: { match: /\s+/, lineBreaks: true, }, + diceOperator: ['d'], separator: [',', ';'], period: ['.'], ifOperator: ['?'], @@ -78,9 +79,9 @@ let ParserRules = [ {"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": ["rollExpression"], "postprocess": id}, - {"name": "rollExpression", "symbols": ["rollExpression", "_", {"literal":"d"}, "_", "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]})}, {"name": "rollExpression", "symbols": ["singleRollExpression"], "postprocess": id}, - {"name": "singleRollExpression", "symbols": [{"literal":"d"}, "_", "exponentExpression"], "postprocess": d => new RollNode({left: new ConstantNode({value: 1, type: 'number'}), right: d[2]})}, + {"name": "singleRollExpression", "symbols": [{"literal":"d"}, "_", "singleRollExpression"], "postprocess": d => new RollNode({left: new ConstantNode({value: 1, type: 'number'}), right: d[2]})}, {"name": "singleRollExpression", "symbols": ["exponentExpression"], "postprocess": id}, {"name": "exponentExpression", "symbols": ["callExpression", "_", (lexer.has("exponentOperator") ? {type: "exponentOperator"} : exponentOperator), "_", "exponentExpression"], "postprocess": d => operator(d, 'exponent')}, {"name": "exponentExpression", "symbols": ["unaryExpression"], "postprocess": id}, diff --git a/app/imports/parser/grammar.ne b/app/imports/parser/grammar.ne index 6035bf5b..c75ea517 100644 --- a/app/imports/parser/grammar.ne +++ b/app/imports/parser/grammar.ne @@ -22,15 +22,16 @@ value: s => s.slice(1, -1), }, name: { - match: /[a-zA-Z_]+/, + match: /[a-zA-Z_]*[a-ce-zA-Z_][a-zA-Z0-9_]*/, type: moo.keywords({ - 'keywords': ['d', 'true', 'false'], + 'keywords': ['true', 'false'], }), }, space: { match: /\s+/, lineBreaks: true, }, + diceOperator: ['d'], separator: [',', ';'], period: ['.'], ifOperator: ['?'], @@ -98,11 +99,11 @@ multiplicativeExpression -> | rollExpression {% id %} rollExpression -> - rollExpression _ "d" _ exponentExpression {% d => new RollNode({left: d[0], right: d[4]}) %} + rollExpression _ %diceOperator _ exponentExpression {% d => new RollNode({left: d[0], right: d[4]}) %} | singleRollExpression {% id %} singleRollExpression -> - "d" _ exponentExpression {% d => new RollNode({left: new ConstantNode({value: 1, type: 'number'}), right: d[2]}) %} + "d" _ singleRollExpression {% d => new RollNode({left: new ConstantNode({value: 1, type: 'number'}), right: d[2]}) %} | exponentExpression {% id %} exponentExpression ->