diff --git a/src/eval.js b/src/eval.js index 707003d..c058ab9 100644 --- a/src/eval.js +++ b/src/eval.js @@ -902,6 +902,8 @@ const do_eval_frame_expr = (node, scope, callsleft) => { value = !expr.result.value } else if(node.operator == 'typeof') { value = typeof(expr.result.value) + } else if(node.operator == '-') { + value = - expr.result.value } else { throw new Error('unknown op') } diff --git a/src/parse_js.js b/src/parse_js.js index cec0423..52aef70 100644 --- a/src/parse_js.js +++ b/src/parse_js.js @@ -101,7 +101,7 @@ const tokenize_js = (str) => { .join('|')}, {name: 'keyword' , re: reserved.map(r => '\\b' + r + '\\b').join('|')}, // TODO all possible notatins for js numbers - {name: 'number' , re: '-?\\d*\\.?\\d+'}, + {name: 'number' , re: '\\d*\\.?\\d+'}, {name: 'identifier' , re: '[A-Za-z_$][A-Za-z0-9_$]*'}, {name: 'punctuation' , @@ -1012,13 +1012,13 @@ const primary = if_fail( ) // operator precedence https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence -// TODO unary minus // TODO instanceof const expr = [ grouping, function_call_or_member_access, unary('!'), + unary('-'), unary('typeof'), binary(['**']), binary(['*','/','%']), diff --git a/test/test.js b/test/test.js index 06f883d..34a2b86 100644 --- a/test/test.js +++ b/test/test.js @@ -573,9 +573,10 @@ export const tests = [ assert_code_evals_to('typeof 1', 'number') }), - test('eval_frame unary minus', () => { - // TODO - //assert_code_evals_to(`-(1)`, -1) + test_only('eval_frame unary minus', () => { + assert_code_evals_to(`-(1)`, -1) + assert_code_evals_to(`-1`, -1) + assert_code_evals_to(`-(-1)`, 1) }), test('eval_frame binary', () => {