diff options
-rw-r--r-- | __tests__/parser.test.js | 18 | ||||
-rw-r--r-- | src/parser.js | 16 |
2 files changed, 32 insertions, 2 deletions
diff --git a/__tests__/parser.test.js b/__tests__/parser.test.js index a741007..74ca442 100644 --- a/__tests__/parser.test.js +++ b/__tests__/parser.test.js @@ -73,6 +73,24 @@ describe('parse', () => { }) }) + it('parses negatives', () => { + expect(parse('-1 + (-(2d6))')).toEqual({ + type: 'add', + left: { + type: 'negative', + value: { type: 'constant', value: 1 } + }, + right: { + type: 'negative', + value: { + type: 'd', + left: { type: 'constant', value: 2 }, + right: { type: 'constant', value: 6 } + } + } + }) + }) + describe('parsing parentheses', () => { test('(1d6)d6', () => { expect(parse('(1d6)d6')).toEqual({ diff --git a/src/parser.js b/src/parser.js index 9f2c6ac..5b9b718 100644 --- a/src/parser.js +++ b/src/parser.js @@ -40,7 +40,12 @@ newSymbol('+', null, 20, (left, parser) => { } }) -newSymbol('-', null, 20, (left, parser) => { +newSymbol('-', (parser) => { + return { + type: 'negative', + value: parser.expression(40) + } +}, 20, (left, parser) => { return { type: 'subtract', left: left, @@ -56,10 +61,17 @@ const newParser = (tokens) => { currentToken: 0, token: function() { return this.tokens[this.currentToken] }, advanceToken: function() { this.currentToken++ }, + match: function(token) { + if (this.token().type === token) { + this.advanceToken() + } else { + throw 'error' + } + }, expression: function(rbp) { let symbol = this.token() - let left = symbol.nud() this.advanceToken() + let left = symbol.nud(this) while (rbp < this.token().lbp) { symbol = this.token() |