Fixed parsing of variable names with numbers and stacked dice rolls like dd8-> 1d(1d8)

This commit is contained in:
Stefan Zermatten
2020-11-13 10:04:37 +02:00
parent fde2f821e7
commit fa24430a7f
2 changed files with 10 additions and 8 deletions

View File

@@ -24,15 +24,16 @@ function id(x) { return x[0]; }
value: s => s.slice(1, -1), value: s => s.slice(1, -1),
}, },
name: { name: {
match: /[a-zA-Z_]+/, match: /[a-zA-Z_]*[a-ce-zA-Z_][a-zA-Z0-9_]*/,
type: moo.keywords({ type: moo.keywords({
'keywords': ['d', 'true', 'false'], 'keywords': ['true', 'false'],
}), }),
}, },
space: { space: {
match: /\s+/, match: /\s+/,
lineBreaks: true, lineBreaks: true,
}, },
diceOperator: ['d'],
separator: [',', ';'], separator: [',', ';'],
period: ['.'], period: ['.'],
ifOperator: ['?'], ifOperator: ['?'],
@@ -78,9 +79,9 @@ let ParserRules = [
{"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')},
{"name": "multiplicativeExpression", "symbols": ["rollExpression"], "postprocess": id}, {"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": "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": "singleRollExpression", "symbols": ["exponentExpression"], "postprocess": id},
{"name": "exponentExpression", "symbols": ["callExpression", "_", (lexer.has("exponentOperator") ? {type: "exponentOperator"} : exponentOperator), "_", "exponentExpression"], "postprocess": d => operator(d, 'exponent')}, {"name": "exponentExpression", "symbols": ["callExpression", "_", (lexer.has("exponentOperator") ? {type: "exponentOperator"} : exponentOperator), "_", "exponentExpression"], "postprocess": d => operator(d, 'exponent')},
{"name": "exponentExpression", "symbols": ["unaryExpression"], "postprocess": id}, {"name": "exponentExpression", "symbols": ["unaryExpression"], "postprocess": id},

View File

@@ -22,15 +22,16 @@
value: s => s.slice(1, -1), value: s => s.slice(1, -1),
}, },
name: { name: {
match: /[a-zA-Z_]+/, match: /[a-zA-Z_]*[a-ce-zA-Z_][a-zA-Z0-9_]*/,
type: moo.keywords({ type: moo.keywords({
'keywords': ['d', 'true', 'false'], 'keywords': ['true', 'false'],
}), }),
}, },
space: { space: {
match: /\s+/, match: /\s+/,
lineBreaks: true, lineBreaks: true,
}, },
diceOperator: ['d'],
separator: [',', ';'], separator: [',', ';'],
period: ['.'], period: ['.'],
ifOperator: ['?'], ifOperator: ['?'],
@@ -98,11 +99,11 @@ multiplicativeExpression ->
| rollExpression {% id %} | rollExpression {% id %}
rollExpression -> 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 {% id %}
singleRollExpression -> 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 {% id %}
exponentExpression -> exponentExpression ->