diff options
| author | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2017-07-15 22:48:10 -0400 | 
|---|---|---|
| committer | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2017-07-15 23:09:22 -0400 | 
| commit | e0ab43bcdc050ca3cac2adea927817d99700737e (patch) | |
| tree | e11746830954eba9ec7a030f5588325c53a258ef /src | |
| parent | 522654d5bf68636a39477f67fa4fd04961f5a6d0 (diff) | |
Throw Error on syntax errors
Diffstat (limited to 'src')
| -rw-r--r-- | src/lexer.js | 2 | ||||
| -rw-r--r-- | src/parser.js | 18 | 
2 files changed, 16 insertions, 4 deletions
| diff --git a/src/lexer.js b/src/lexer.js index f559816..5e29e42 100644 --- a/src/lexer.js +++ b/src/lexer.js @@ -43,7 +43,7 @@ const lex = (expressionString) => {      })      if (!matched) { -      return 'error' +      throw new Error('Syntax error: unrecognized token')      }    } diff --git a/src/parser.js b/src/parser.js index 5b9b718..fc9add3 100644 --- a/src/parser.js +++ b/src/parser.js @@ -2,8 +2,17 @@ const { lex } = require('./lexer.js')  let symbols = {} +let throwSyntaxError = () => { +  throw new Error('Syntax error: unexpected token') +} +  let newSymbol = (type, nud, lbp, led) => { -  symbols[type] = { type, nud, lbp, led } +  symbols[type] = { +    type, +    nud: nud || throwSyntaxError, +    lbp, +    led: led || throwSyntaxError +  }  }  let lexemeToToken = lexeme => { @@ -65,7 +74,7 @@ const newParser = (tokens) => {        if (this.token().type === token) {          this.advanceToken()        } else { -        throw 'error' +        throw throwSyntaxError()        }      },      expression: function(rbp) { @@ -89,7 +98,10 @@ const parse = expressionString => {    tokens.push(symbols.end)    const parser = newParser(tokens) -  return parser.expression(0) +  const expression = parser.expression(0) +  parser.match('end') + +  return expression  } |