From fcd53dde6ac5e9012548c11ad372f47989c300b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gunnlaugur=20=C3=9E=C3=B3r=20Briem?= Date: Wed, 9 Aug 2023 09:46:30 +0000 Subject: [PATCH 1/3] test: failing case 42-51 --- src/syntax/expr.spec.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/syntax/expr.spec.ts b/src/syntax/expr.spec.ts index 5cb2efd..8d75707 100644 --- a/src/syntax/expr.spec.ts +++ b/src/syntax/expr.spec.ts @@ -400,6 +400,19 @@ line`, } }); + checkTreeExpr(['42-51', '42 - 51'], { + type: 'binary', + op: '-', + left: { + type: 'integer', + value: 42, + }, + right: { + type: 'integer', + value: 51, + } + }); + checkTreeExpr(['42*51', '42 * 51'], { type: 'binary', op: '*', From 4bf7ac869f4c72b697ee66912a4b6af01bf87373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gunnlaugur=20=C3=9E=C3=B3r=20Briem?= Date: Wed, 9 Aug 2023 09:47:31 +0000 Subject: [PATCH 2/3] fix: move int/float lexer rules to below op_minus --- src/lexer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lexer.ts b/src/lexer.ts index eafe785..360cbfc 100644 --- a/src/lexer.ts +++ b/src/lexer.ts @@ -51,8 +51,6 @@ export const lexer = compile({ star: '*', comma: ',', space: { match: /[\s\t\n\v\f\r]+/, lineBreaks: true, }, - int: /\-?\d+(?![\.\d])/, - float: /\-?(?:(?:\d*\.\d+)|(?:\d+\.\d*))/, // word: /[a-zA-Z][A-Za-z0-9_\-]*/, lparen: '(', rparen: ')', @@ -71,6 +69,8 @@ export const lexer = compile({ op_membertext: '->>', op_member: '->', op_minus: '-', + int: /\-?\d+(?![\.\d])/, + float: /\-?(?:(?:\d*\.\d+)|(?:\d+\.\d*))/, op_div: /\//, op_not_ilike: /\!~~\*/, // !~~* =ILIKE op_not_like: /\!~~/, // !~~ =LIKE From 995c5382f686fd2756fb4b718310929234132fea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gunnlaugur=20=C3=9E=C3=B3r=20Briem?= Date: Tue, 27 Feb 2024 10:35:07 +0000 Subject: [PATCH 3/3] Address test failures Change some test expectations to expect a unary minus expression. Change the parsing of ->>-9 and of SET TIMEZONE -9 to convert the unary minus expression to a negative integer. --- src/lexer.spec.ts | 9 ++++++--- src/syntax/expr.ne | 8 +++++++- src/syntax/expr.spec.ts | 29 ++++++++++++++++++++++++----- src/syntax/simple-statements.ne | 1 + 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/lexer.spec.ts b/src/lexer.spec.ts index 73452e3..03e58f6 100644 --- a/src/lexer.spec.ts +++ b/src/lexer.spec.ts @@ -168,15 +168,18 @@ describe('Lexer', () => { next({ type: 'comma' }); next({ type: 'float', value: '.1' }); next({ type: 'comma' }); - next({ type: 'float', value: '-.1' }); + next({ type: 'op_minus' }); + next({ type: 'float', value: '.1' }); next({ type: 'comma' }); - next({ type: 'float', value: '-0.1' }); + next({ type: 'op_minus' }); + next({ type: 'float', value: '0.1' }); next({ type: 'comma' }); next({ type: 'float', value: '0.1' }); next({ type: 'comma' }); next({ type: 'float', value: '10.' }); next({ type: 'comma' }); - next({ type: 'float', value: '-10.' }); + next({ type: 'op_minus' }); + next({ type: 'float', value: '10.' }); }) it('tokenizes ->', () => { diff --git a/src/syntax/expr.ne b/src/syntax/expr.ne index aff8c67..a7ce40f 100644 --- a/src/syntax/expr.ne +++ b/src/syntax/expr.ne @@ -107,7 +107,13 @@ expr_array_index | expr_member {% unwrap %} expr_member - -> (expr_member | expr_paren) ops_member (string | int) {% x => track(x, { + -> (expr_member | expr_paren) ops_member %op_minus int {% x => track(x, { + type: 'member', + operand: unwrap(x[0]), + op: x[1], + member: -unwrap(x[3]) + }) %} + | (expr_member | expr_paren) ops_member (string | int) {% x => track(x, { type: 'member', operand: unwrap(x[0]), op: x[1], diff --git a/src/syntax/expr.spec.ts b/src/syntax/expr.spec.ts index 8d75707..b1e4107 100644 --- a/src/syntax/expr.spec.ts +++ b/src/syntax/expr.spec.ts @@ -46,18 +46,37 @@ describe('Expressions', () => { }); checkTreeExpr(['-0.5', '-.5'], { - type: 'numeric', - value: -0.5, + type: 'unary', + op: '-', + operand: { + type: 'numeric', + value: 0.5, + } }); checkTreeExpr(['-42.', '-42.0'], { - type: 'numeric', - value: -42, + type: 'unary', + op: '-', + operand: { + type: 'numeric', + value: 42, + } }); checkInvalidExpr('42. 51'); - checkInvalidExpr('42.-51'); + checkTreeExpr(['42.-51'], { + type: 'binary', + op: '-', + left: { + type: 'numeric', + value: 42, + }, + right: { + type: 'integer', + value: 51, + }, + }); checkTreeExprLoc(['null'], { _location: { start: 0, end: 4 }, diff --git a/src/syntax/simple-statements.ne b/src/syntax/simple-statements.ne index 7677bbf..bc989be 100644 --- a/src/syntax/simple-statements.ne +++ b/src/syntax/simple-statements.ne @@ -40,6 +40,7 @@ simplestatements_set_timezone -> kw_time kw_zone simplestatements_set_timezone_v simplestatements_set_timezone_val -> (string | int) {% x => track(x, { type: 'value', value: unwrap(x[0]) }) %} + | %op_minus int {% x => track(x, { type: 'value', value: -unwrap(x[1]) }) %} | kw_local {% x => track(x, { type: 'local'}) %} | %kw_default {% x => track(x, { type: 'default'}) %} | kw_interval string kw_hour %kw_to kw_minute {% x => track(x, { type: 'interval', value: unbox(x[1]) }) %}