unary minus

This commit is contained in:
Dmitry Vasilev
2022-12-07 05:52:13 +08:00
parent 7e2f2d82b9
commit 3d4bcbf66e
3 changed files with 8 additions and 5 deletions

View File

@@ -902,6 +902,8 @@ const do_eval_frame_expr = (node, scope, callsleft) => {
value = !expr.result.value value = !expr.result.value
} else if(node.operator == 'typeof') { } else if(node.operator == 'typeof') {
value = typeof(expr.result.value) value = typeof(expr.result.value)
} else if(node.operator == '-') {
value = - expr.result.value
} else { } else {
throw new Error('unknown op') throw new Error('unknown op')
} }

View File

@@ -101,7 +101,7 @@ const tokenize_js = (str) => {
.join('|')}, .join('|')},
{name: 'keyword' , re: reserved.map(r => '\\b' + r + '\\b').join('|')}, {name: 'keyword' , re: reserved.map(r => '\\b' + r + '\\b').join('|')},
// TODO all possible notatins for js numbers // 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: 'identifier' , re: '[A-Za-z_$][A-Za-z0-9_$]*'},
{name: 'punctuation' , {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 // operator precedence https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
// TODO unary minus
// TODO instanceof // TODO instanceof
const expr = const expr =
[ [
grouping, grouping,
function_call_or_member_access, function_call_or_member_access,
unary('!'), unary('!'),
unary('-'),
unary('typeof'), unary('typeof'),
binary(['**']), binary(['**']),
binary(['*','/','%']), binary(['*','/','%']),

View File

@@ -573,9 +573,10 @@ export const tests = [
assert_code_evals_to('typeof 1', 'number') assert_code_evals_to('typeof 1', 'number')
}), }),
test('eval_frame unary minus', () => { test_only('eval_frame unary minus', () => {
// TODO assert_code_evals_to(`-(1)`, -1)
//assert_code_evals_to(`-(1)`, -1) assert_code_evals_to(`-1`, -1)
assert_code_evals_to(`-(-1)`, 1)
}), }),
test('eval_frame binary', () => { test('eval_frame binary', () => {