Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expression that subtracts a literal number without space fails to parse #133

Open
gthb opened this issue Aug 8, 2023 · 1 comment · May be fixed by #152
Open

Expression that subtracts a literal number without space fails to parse #133

gthb opened this issue Aug 8, 2023 · 1 comment · May be fixed by #152

Comments

@gthb
Copy link
Contributor

gthb commented Aug 8, 2023

This existing test passes just fine:

        checkTreeExpr(['42+51', '42 + 51'], {
            type: 'binary',
            op: '+',
            left: {
                type: 'integer',
                value: 42,
            },
            right: {
                type: 'integer',
                value: 51,
            }
        });

... but adding this corresponding test for subtraction fails:

        checkTreeExpr(['42-51', '42 - 51'], {
            type: 'binary',
            op: '-',
            left: {
                type: 'integer',
                value: 42,
            },
            right: {
                type: 'integer',
                value: 51,
            }
        });

... with a syntax error saying: Unexpected int token: "-51" in the spaceless case, so presumably the problem is that lexical analysis outputs the two tokens LITERAL 42, LITERAL -51, but the parsing only works if the tokens are LITERAL 42, MINUS, LITERAL 51, i.e. the minus token should have a higher precedence than the negative integer literal token.

Full test failure output
     Error: Syntax error at line 1 col 3:

42-51
^
Unexpected int token: "-51". Instead, I was expecting to see one of the following:

A op_cast token based on:
expr_member → expr_member$subexpression$3 ● %op_cast data_type
expr_various_constructs$macrocall$4 → ● expr_member
expr_various_constructs$macrocall$1 → ● expr_various_constructs$macrocall$4
expr_various_constructs → ● expr_various_constructs$macrocall$1
expr_string_compare$macrocall$4 → ● expr_various_constructs
expr_string_compare$macrocall$1 → ● expr_string_compare$macrocall$4
expr_string_compare → ● expr_string_compare$macrocall$1
expr_unary_add$macrocall$4 → ● expr_string_compare
expr_unary_add$macrocall$1 → ● expr_unary_add$macrocall$4
expr_unary_add → ● expr_unary_add$macrocall$1
expr_exp$macrocall$4 → ● expr_unary_add
expr_exp$macrocall$1 → ● expr_exp$macrocall$4
expr_exp → ● expr_exp$macrocall$1
expr_mult$macrocall$4 → ● expr_exp
expr_mult$macrocall$1 → ● expr_mult$macrocall$4
expr_mult → ● expr_mult$macrocall$1
expr_add$macrocall$4 → ● expr_mult
expr_add$macrocall$1 → ● expr_add$macrocall$4
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A op_member token based on:
ops_member$subexpression$1 → ● %op_member
ops_member → ● ops_member$subexpression$1
expr_member → expr_member$subexpression$1 ● ops_member expr_member$subexpression$2
expr_various_constructs$macrocall$4 → ● expr_member
expr_various_constructs$macrocall$1 → ● expr_various_constructs$macrocall$4
expr_various_constructs → ● expr_various_constructs$macrocall$1
expr_string_compare$macrocall$4 → ● expr_various_constructs
expr_string_compare$macrocall$1 → ● expr_string_compare$macrocall$4
expr_string_compare → ● expr_string_compare$macrocall$1
expr_unary_add$macrocall$4 → ● expr_string_compare
expr_unary_add$macrocall$1 → ● expr_unary_add$macrocall$4
expr_unary_add → ● expr_unary_add$macrocall$1
expr_exp$macrocall$4 → ● expr_unary_add
expr_exp$macrocall$1 → ● expr_exp$macrocall$4
expr_exp → ● expr_exp$macrocall$1
expr_mult$macrocall$4 → ● expr_exp
expr_mult$macrocall$1 → ● expr_mult$macrocall$4
expr_mult → ● expr_mult$macrocall$1
expr_add$macrocall$4 → ● expr_mult
expr_add$macrocall$1 → ● expr_add$macrocall$4
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A op_membertext token based on:
ops_member$subexpression$1 → ● %op_membertext
ops_member → ● ops_member$subexpression$1
expr_member → expr_member$subexpression$1 ● ops_member expr_member$subexpression$2
expr_various_constructs$macrocall$4 → ● expr_member
expr_various_constructs$macrocall$1 → ● expr_various_constructs$macrocall$4
expr_various_constructs → ● expr_various_constructs$macrocall$1
expr_string_compare$macrocall$4 → ● expr_various_constructs
expr_string_compare$macrocall$1 → ● expr_string_compare$macrocall$4
expr_string_compare → ● expr_string_compare$macrocall$1
expr_unary_add$macrocall$4 → ● expr_string_compare
expr_unary_add$macrocall$1 → ● expr_unary_add$macrocall$4
expr_unary_add → ● expr_unary_add$macrocall$1
expr_exp$macrocall$4 → ● expr_unary_add
expr_exp$macrocall$1 → ● expr_exp$macrocall$4
expr_exp → ● expr_exp$macrocall$1
expr_mult$macrocall$4 → ● expr_exp
expr_mult$macrocall$1 → ● expr_mult$macrocall$4
expr_mult → ● expr_mult$macrocall$1
expr_add$macrocall$4 → ● expr_mult
expr_add$macrocall$1 → ● expr_add$macrocall$4
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A word token based on:
kw_at → ● %word
various_binaries → ● kw_at kw_time kw_zone
expr_various_constructs$macrocall$2$macrocall$2 → ● various_binaries
expr_various_constructs$macrocall$2$macrocall$1 → ● expr_various_constructs$macrocall$2$macrocall$2
expr_various_constructs$macrocall$2 → ● expr_various_constructs$macrocall$2$macrocall$1
expr_various_constructs$macrocall$1 → expr_various_constructs$macrocall$1$subexpression$1 ● expr_various_constructs$macrocall$2 expr_various_constructs$macrocall$1$subexpression$2
expr_various_constructs → ● expr_various_constructs$macrocall$1
expr_string_compare$macrocall$4 → ● expr_various_constructs
expr_string_compare$macrocall$1 → ● expr_string_compare$macrocall$4
expr_string_compare → ● expr_string_compare$macrocall$1
expr_unary_add$macrocall$4 → ● expr_string_compare
expr_unary_add$macrocall$1 → ● expr_unary_add$macrocall$4
expr_unary_add → ● expr_unary_add$macrocall$1
expr_exp$macrocall$4 → ● expr_unary_add
expr_exp$macrocall$1 → ● expr_exp$macrocall$4
expr_exp → ● expr_exp$macrocall$1
expr_mult$macrocall$4 → ● expr_exp
expr_mult$macrocall$1 → ● expr_mult$macrocall$4
expr_mult → ● expr_mult$macrocall$1
expr_add$macrocall$4 → ● expr_mult
expr_add$macrocall$1 → ● expr_add$macrocall$4
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A word token based on:
kw_contains → ● %word
ops_string_compare → ● kw_contains
expr_string_compare$macrocall$2$macrocall$2 → ● ops_string_compare
expr_string_compare$macrocall$2$macrocall$1 → ● expr_string_compare$macrocall$2$macrocall$2
expr_string_compare$macrocall$2 → ● expr_string_compare$macrocall$2$macrocall$1
expr_string_compare$macrocall$1 → expr_string_compare$macrocall$1$subexpression$1 ● expr_string_compare$macrocall$2 expr_string_compare$macrocall$1$subexpression$2
expr_string_compare → ● expr_string_compare$macrocall$1
expr_unary_add$macrocall$4 → ● expr_string_compare
expr_unary_add$macrocall$1 → ● expr_unary_add$macrocall$4
expr_unary_add → ● expr_unary_add$macrocall$1
expr_exp$macrocall$4 → ● expr_unary_add
expr_exp$macrocall$1 → ● expr_exp$macrocall$4
expr_exp → ● expr_exp$macrocall$1
expr_mult$macrocall$4 → ● expr_exp
expr_mult$macrocall$1 → ● expr_mult$macrocall$4
expr_mult → ● expr_mult$macrocall$1
expr_add$macrocall$4 → ● expr_mult
expr_add$macrocall$1 → ● expr_add$macrocall$4
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A word token based on:
kw_matches → ● %word
ops_string_compare → ● kw_matches
expr_string_compare$macrocall$2$macrocall$2 → ● ops_string_compare
expr_string_compare$macrocall$2$macrocall$1 → ● expr_string_compare$macrocall$2$macrocall$2
expr_string_compare$macrocall$2 → ● expr_string_compare$macrocall$2$macrocall$1
expr_string_compare$macrocall$1 → expr_string_compare$macrocall$1$subexpression$1 ● expr_string_compare$macrocall$2 expr_string_compare$macrocall$1$subexpression$2
expr_string_compare → ● expr_string_compare$macrocall$1
expr_unary_add$macrocall$4 → ● expr_string_compare
expr_unary_add$macrocall$1 → ● expr_unary_add$macrocall$4
expr_unary_add → ● expr_unary_add$macrocall$1
expr_exp$macrocall$4 → ● expr_unary_add
expr_exp$macrocall$1 → ● expr_exp$macrocall$4
expr_exp → ● expr_exp$macrocall$1
expr_mult$macrocall$4 → ● expr_exp
expr_mult$macrocall$1 → ● expr_mult$macrocall$4
expr_mult → ● expr_mult$macrocall$1
expr_add$macrocall$4 → ● expr_mult
expr_add$macrocall$1 → ● expr_add$macrocall$4
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A word token based on:
kw_ends → ● %word
kw_endswith → ● kw_ends %kw_with
ops_string_compare → ● kw_endswith
expr_string_compare$macrocall$2$macrocall$2 → ● ops_string_compare
expr_string_compare$macrocall$2$macrocall$1 → ● expr_string_compare$macrocall$2$macrocall$2
expr_string_compare$macrocall$2 → ● expr_string_compare$macrocall$2$macrocall$1
expr_string_compare$macrocall$1 → expr_string_compare$macrocall$1$subexpression$1 ● expr_string_compare$macrocall$2 expr_string_compare$macrocall$1$subexpression$2
expr_string_compare → ● expr_string_compare$macrocall$1
expr_unary_add$macrocall$4 → ● expr_string_compare
expr_unary_add$macrocall$1 → ● expr_unary_add$macrocall$4
expr_unary_add → ● expr_unary_add$macrocall$1
expr_exp$macrocall$4 → ● expr_unary_add
expr_exp$macrocall$1 → ● expr_exp$macrocall$4
expr_exp → ● expr_exp$macrocall$1
expr_mult$macrocall$4 → ● expr_exp
expr_mult$macrocall$1 → ● expr_mult$macrocall$4
expr_mult → ● expr_mult$macrocall$1
expr_add$macrocall$4 → ● expr_mult
expr_add$macrocall$1 → ● expr_add$macrocall$4
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A word token based on:
kw_starts → ● %word
kw_startswith → ● kw_starts %kw_with
ops_string_compare → ● kw_startswith
expr_string_compare$macrocall$2$macrocall$2 → ● ops_string_compare
expr_string_compare$macrocall$2$macrocall$1 → ● expr_string_compare$macrocall$2$macrocall$2
expr_string_compare$macrocall$2 → ● expr_string_compare$macrocall$2$macrocall$1
expr_string_compare$macrocall$1 → expr_string_compare$macrocall$1$subexpression$1 ● expr_string_compare$macrocall$2 expr_string_compare$macrocall$1$subexpression$2
expr_string_compare → ● expr_string_compare$macrocall$1
expr_unary_add$macrocall$4 → ● expr_string_compare
expr_unary_add$macrocall$1 → ● expr_unary_add$macrocall$4
expr_unary_add → ● expr_unary_add$macrocall$1
expr_exp$macrocall$4 → ● expr_unary_add
expr_exp$macrocall$1 → ● expr_exp$macrocall$4
expr_exp → ● expr_exp$macrocall$1
expr_mult$macrocall$4 → ● expr_exp
expr_mult$macrocall$1 → ● expr_mult$macrocall$4
expr_mult → ● expr_mult$macrocall$1
expr_add$macrocall$4 → ● expr_mult
expr_add$macrocall$1 → ● expr_add$macrocall$4
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A word token based on:
kw_operator → ● %word
expr_exp$macrocall$2$macrocall$1 → ● kw_operator lparen ident dot expr_exp$macrocall$2$macrocall$2 rparen
expr_exp$macrocall$2 → ● expr_exp$macrocall$2$macrocall$1
expr_exp$macrocall$1 → expr_exp$macrocall$1$subexpression$1 ● expr_exp$macrocall$2 expr_exp$macrocall$1$subexpression$2
expr_exp → ● expr_exp$macrocall$1
expr_mult$macrocall$4 → ● expr_exp
expr_mult$macrocall$1 → ● expr_mult$macrocall$4
expr_mult → ● expr_mult$macrocall$1
expr_add$macrocall$4 → ● expr_mult
expr_add$macrocall$1 → ● expr_add$macrocall$4
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A op_exp token based on:
expr_exp$macrocall$2$macrocall$2 → ● %op_exp
expr_exp$macrocall$2$macrocall$1$macrocall$2 → ● expr_exp$macrocall$2$macrocall$2
expr_exp$macrocall$2$macrocall$1$macrocall$1 → ● expr_exp$macrocall$2$macrocall$1$macrocall$2
expr_exp$macrocall$2$macrocall$1 → ● expr_exp$macrocall$2$macrocall$1$macrocall$1
expr_exp$macrocall$2 → ● expr_exp$macrocall$2$macrocall$1
expr_exp$macrocall$1 → expr_exp$macrocall$1$subexpression$1 ● expr_exp$macrocall$2 expr_exp$macrocall$1$subexpression$2
expr_exp → ● expr_exp$macrocall$1
expr_mult$macrocall$4 → ● expr_exp
expr_mult$macrocall$1 → ● expr_mult$macrocall$4
expr_mult → ● expr_mult$macrocall$1
expr_add$macrocall$4 → ● expr_mult
expr_add$macrocall$1 → ● expr_add$macrocall$4
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A star token based on:
expr_mult$macrocall$2$macrocall$2$subexpression$1 → ● %star
expr_mult$macrocall$2$macrocall$2 → ● expr_mult$macrocall$2$macrocall$2$subexpression$1
expr_mult$macrocall$2$macrocall$1$macrocall$2 → ● expr_mult$macrocall$2$macrocall$2
expr_mult$macrocall$2$macrocall$1$macrocall$1 → ● expr_mult$macrocall$2$macrocall$1$macrocall$2
expr_mult$macrocall$2$macrocall$1 → ● expr_mult$macrocall$2$macrocall$1$macrocall$1
expr_mult$macrocall$2 → ● expr_mult$macrocall$2$macrocall$1
expr_mult$macrocall$1 → expr_mult$macrocall$1$subexpression$1 ● expr_mult$macrocall$2 expr_mult$macrocall$1$subexpression$2
expr_mult → ● expr_mult$macrocall$1
expr_add$macrocall$4 → ● expr_mult
expr_add$macrocall$1 → ● expr_add$macrocall$4
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A op_div token based on:
expr_mult$macrocall$2$macrocall$2$subexpression$1 → ● %op_div
expr_mult$macrocall$2$macrocall$2 → ● expr_mult$macrocall$2$macrocall$2$subexpression$1
expr_mult$macrocall$2$macrocall$1$macrocall$2 → ● expr_mult$macrocall$2$macrocall$2
expr_mult$macrocall$2$macrocall$1$macrocall$1 → ● expr_mult$macrocall$2$macrocall$1$macrocall$2
expr_mult$macrocall$2$macrocall$1 → ● expr_mult$macrocall$2$macrocall$1$macrocall$1
expr_mult$macrocall$2 → ● expr_mult$macrocall$2$macrocall$1
expr_mult$macrocall$1 → expr_mult$macrocall$1$subexpression$1 ● expr_mult$macrocall$2 expr_mult$macrocall$1$subexpression$2
expr_mult → ● expr_mult$macrocall$1
expr_add$macrocall$4 → ● expr_mult
expr_add$macrocall$1 → ● expr_add$macrocall$4
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A op_mod token based on:
expr_mult$macrocall$2$macrocall$2$subexpression$1 → ● %op_mod
expr_mult$macrocall$2$macrocall$2 → ● expr_mult$macrocall$2$macrocall$2$subexpression$1
expr_mult$macrocall$2$macrocall$1$macrocall$2 → ● expr_mult$macrocall$2$macrocall$2
expr_mult$macrocall$2$macrocall$1$macrocall$1 → ● expr_mult$macrocall$2$macrocall$1$macrocall$2
expr_mult$macrocall$2$macrocall$1 → ● expr_mult$macrocall$2$macrocall$1$macrocall$1
expr_mult$macrocall$2 → ● expr_mult$macrocall$2$macrocall$1
expr_mult$macrocall$1 → expr_mult$macrocall$1$subexpression$1 ● expr_mult$macrocall$2 expr_mult$macrocall$1$subexpression$2
expr_mult → ● expr_mult$macrocall$1
expr_add$macrocall$4 → ● expr_mult
expr_add$macrocall$1 → ● expr_add$macrocall$4
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A op_plus token based on:
expr_add$macrocall$2$macrocall$2$subexpression$1 → ● %op_plus
expr_add$macrocall$2$macrocall$2 → ● expr_add$macrocall$2$macrocall$2$subexpression$1
expr_add$macrocall$2$macrocall$1$macrocall$2 → ● expr_add$macrocall$2$macrocall$2
expr_add$macrocall$2$macrocall$1$macrocall$1 → ● expr_add$macrocall$2$macrocall$1$macrocall$2
expr_add$macrocall$2$macrocall$1 → ● expr_add$macrocall$2$macrocall$1$macrocall$1
expr_add$macrocall$2 → ● expr_add$macrocall$2$macrocall$1
expr_add$macrocall$1 → expr_add$macrocall$1$subexpression$1 ● expr_add$macrocall$2 expr_add$macrocall$1$subexpression$2
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A op_minus token based on:
expr_add$macrocall$2$macrocall$2$subexpression$1 → ● %op_minus
expr_add$macrocall$2$macrocall$2 → ● expr_add$macrocall$2$macrocall$2$subexpression$1
expr_add$macrocall$2$macrocall$1$macrocall$2 → ● expr_add$macrocall$2$macrocall$2
expr_add$macrocall$2$macrocall$1$macrocall$1 → ● expr_add$macrocall$2$macrocall$1$macrocall$2
expr_add$macrocall$2$macrocall$1 → ● expr_add$macrocall$2$macrocall$1$macrocall$1
expr_add$macrocall$2 → ● expr_add$macrocall$2$macrocall$1
expr_add$macrocall$1 → expr_add$macrocall$1$subexpression$1 ● expr_add$macrocall$2 expr_add$macrocall$1$subexpression$2
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A op_additive token based on:
expr_add$macrocall$2$macrocall$2$subexpression$1 → ● %op_additive
expr_add$macrocall$2$macrocall$2 → ● expr_add$macrocall$2$macrocall$2$subexpression$1
expr_add$macrocall$2$macrocall$1$macrocall$2 → ● expr_add$macrocall$2$macrocall$2
expr_add$macrocall$2$macrocall$1$macrocall$1 → ● expr_add$macrocall$2$macrocall$1$macrocall$2
expr_add$macrocall$2$macrocall$1 → ● expr_add$macrocall$2$macrocall$1$macrocall$1
expr_add$macrocall$2 → ● expr_add$macrocall$2$macrocall$1
expr_add$macrocall$1 → expr_add$macrocall$1$subexpression$1 ● expr_add$macrocall$2 expr_add$macrocall$1$subexpression$2
expr_add → ● expr_add$macrocall$1
expr_in$macrocall$4 → ● expr_add
expr_in$macrocall$1 → ● expr_in$macrocall$4
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A kw_not token based on:
ops_in$ebnf$1 → ● %kw_not
ops_in → ● ops_in$ebnf$1 %kw_in
expr_in$macrocall$2$macrocall$2 → ● ops_in
expr_in$macrocall$2$macrocall$1 → ● expr_in$macrocall$2$macrocall$2
expr_in$macrocall$2 → ● expr_in$macrocall$2$macrocall$1
expr_in$macrocall$1 → expr_in$macrocall$1$subexpression$1 ● expr_in$macrocall$2 expr_in$macrocall$1$subexpression$2
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A kw_in token based on:
ops_in → ops_in$ebnf$1 ● %kw_in
expr_in$macrocall$2$macrocall$2 → ● ops_in
expr_in$macrocall$2$macrocall$1 → ● expr_in$macrocall$2$macrocall$2
expr_in$macrocall$2 → ● expr_in$macrocall$2$macrocall$1
expr_in$macrocall$1 → expr_in$macrocall$1$subexpression$1 ● expr_in$macrocall$2 expr_in$macrocall$1$subexpression$2
expr_in → ● expr_in$macrocall$1
expr_like$macrocall$4 → ● expr_in
expr_like$macrocall$1 → ● expr_like$macrocall$4
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A kw_not token based on:
ops_like_keywors$ebnf$1 → ● %kw_not
ops_like_keywors → ● ops_like_keywors$ebnf$1 ops_like_keywors$subexpression$1
ops_like → ● ops_like_keywors
expr_like$macrocall$2$macrocall$2 → ● ops_like
expr_like$macrocall$2$macrocall$1 → ● expr_like$macrocall$2$macrocall$2
expr_like$macrocall$2 → ● expr_like$macrocall$2$macrocall$1
expr_like$macrocall$1 → expr_like$macrocall$1$subexpression$1 ● expr_like$macrocall$2 expr_like$macrocall$1$subexpression$2
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A op_like token based on:
ops_like_operators$subexpression$1 → ● %op_like
ops_like_operators → ● ops_like_operators$subexpression$1
ops_like → ● ops_like_operators
expr_like$macrocall$2$macrocall$2 → ● ops_like
expr_like$macrocall$2$macrocall$1 → ● expr_like$macrocall$2$macrocall$2
expr_like$macrocall$2 → ● expr_like$macrocall$2$macrocall$1
expr_like$macrocall$1 → expr_like$macrocall$1$subexpression$1 ● expr_like$macrocall$2 expr_like$macrocall$1$subexpression$2
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A op_ilike token based on:
ops_like_operators$subexpression$2 → ● %op_ilike
ops_like_operators → ● ops_like_operators$subexpression$2
ops_like → ● ops_like_operators
expr_like$macrocall$2$macrocall$2 → ● ops_like
expr_like$macrocall$2$macrocall$1 → ● expr_like$macrocall$2$macrocall$2
expr_like$macrocall$2 → ● expr_like$macrocall$2$macrocall$1
expr_like$macrocall$1 → expr_like$macrocall$1$subexpression$1 ● expr_like$macrocall$2 expr_like$macrocall$1$subexpression$2
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A op_not_like token based on:
ops_like_operators$subexpression$3 → ● %op_not_like
ops_like_operators → ● ops_like_operators$subexpression$3
ops_like → ● ops_like_operators
expr_like$macrocall$2$macrocall$2 → ● ops_like
expr_like$macrocall$2$macrocall$1 → ● expr_like$macrocall$2$macrocall$2
expr_like$macrocall$2 → ● expr_like$macrocall$2$macrocall$1
expr_like$macrocall$1 → expr_like$macrocall$1$subexpression$1 ● expr_like$macrocall$2 expr_like$macrocall$1$subexpression$2
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A op_not_ilike token based on:
ops_like_operators$subexpression$4 → ● %op_not_ilike
ops_like_operators → ● ops_like_operators$subexpression$4
ops_like → ● ops_like_operators
expr_like$macrocall$2$macrocall$2 → ● ops_like
expr_like$macrocall$2$macrocall$1 → ● expr_like$macrocall$2$macrocall$2
expr_like$macrocall$2 → ● expr_like$macrocall$2$macrocall$1
expr_like$macrocall$1 → expr_like$macrocall$1$subexpression$1 ● expr_like$macrocall$2 expr_like$macrocall$1$subexpression$2
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A kw_like token based on:
ops_like_keywors$subexpression$1 → ● %kw_like
ops_like_keywors → ops_like_keywors$ebnf$1 ● ops_like_keywors$subexpression$1
ops_like → ● ops_like_keywors
expr_like$macrocall$2$macrocall$2 → ● ops_like
expr_like$macrocall$2$macrocall$1 → ● expr_like$macrocall$2$macrocall$2
expr_like$macrocall$2 → ● expr_like$macrocall$2$macrocall$1
expr_like$macrocall$1 → expr_like$macrocall$1$subexpression$1 ● expr_like$macrocall$2 expr_like$macrocall$1$subexpression$2
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A kw_ilike token based on:
ops_like_keywors$subexpression$1 → ● %kw_ilike
ops_like_keywors → ops_like_keywors$ebnf$1 ● ops_like_keywors$subexpression$1
ops_like → ● ops_like_keywors
expr_like$macrocall$2$macrocall$2 → ● ops_like
expr_like$macrocall$2$macrocall$1 → ● expr_like$macrocall$2$macrocall$2
expr_like$macrocall$2 → ● expr_like$macrocall$2$macrocall$1
expr_like$macrocall$1 → expr_like$macrocall$1$subexpression$1 ● expr_like$macrocall$2 expr_like$macrocall$1$subexpression$2
expr_like → ● expr_like$macrocall$1
expr_others$macrocall$4 → ● expr_like
expr_others$macrocall$1 → ● expr_others$macrocall$4
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A ops_others token based on:
expr_others$macrocall$2$macrocall$2 → ● %ops_others
expr_others$macrocall$2$macrocall$1$macrocall$2 → ● expr_others$macrocall$2$macrocall$2
expr_others$macrocall$2$macrocall$1$macrocall$1 → ● expr_others$macrocall$2$macrocall$1$macrocall$2
expr_others$macrocall$2$macrocall$1 → ● expr_others$macrocall$2$macrocall$1$macrocall$1
expr_others$macrocall$2 → ● expr_others$macrocall$2$macrocall$1
expr_others$macrocall$1 → expr_others$macrocall$1$subexpression$1 ● expr_others$macrocall$2 expr_others$macrocall$1$subexpression$2
expr_others → ● expr_others$macrocall$1
expr_range$macrocall$5 → ● expr_others
expr_range$macrocall$1 → ● expr_range$macrocall$5
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A kw_not token based on:
ops_between$ebnf$1 → ● %kw_not
ops_between → ● ops_between$ebnf$1 kw_between
expr_range$macrocall$2 → ● ops_between
expr_range$macrocall$1 → expr_range$macrocall$1$subexpression$1 ● expr_range$macrocall$2 expr_range$macrocall$1$subexpression$2 expr_range$macrocall$3 expr_range$macrocall$1$subexpression$3
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A kw_is token based on:
expr_is → expr_is$subexpression$5 ● %kw_is expr_is$ebnf$1 expr_is$subexpression$6
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A kw_notnull token based on:
expr_is$subexpression$4 → ● %kw_notnull
expr_is → expr_is$subexpression$3 ● expr_is$subexpression$4
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A kw_is token based on:
expr_is$subexpression$4 → ● %kw_is kw_not_null
expr_is → expr_is$subexpression$3 ● expr_is$subexpression$4
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A kw_isnull token based on:
expr_is$subexpression$2 → ● %kw_isnull
expr_is → expr_is$subexpression$1 ● expr_is$subexpression$2
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A kw_is token based on:
expr_is$subexpression$2 → ● %kw_is %kw_null
expr_is → expr_is$subexpression$1 ● expr_is$subexpression$2
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A word token based on:
kw_between → ● %word
ops_between → ops_between$ebnf$1 ● kw_between
expr_range$macrocall$2 → ● ops_between
expr_range$macrocall$1 → expr_range$macrocall$1$subexpression$1 ● expr_range$macrocall$2 expr_range$macrocall$1$subexpression$2 expr_range$macrocall$3 expr_range$macrocall$1$subexpression$3
expr_range → ● expr_range$macrocall$1
expr_compare$macrocall$4 → ● expr_range
expr_compare$macrocall$1 → ● expr_compare$macrocall$4
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A op_compare token based on:
expr_compare$macrocall$2$macrocall$2 → ● %op_compare
expr_compare$macrocall$2$macrocall$1$macrocall$2 → ● expr_compare$macrocall$2$macrocall$2
expr_compare$macrocall$2$macrocall$1$macrocall$1 → ● expr_compare$macrocall$2$macrocall$1$macrocall$2
expr_compare$macrocall$2$macrocall$1 → ● expr_compare$macrocall$2$macrocall$1$macrocall$1
expr_compare$macrocall$2 → ● expr_compare$macrocall$2$macrocall$1
expr_compare$macrocall$1 → expr_compare$macrocall$1$subexpression$1 ● expr_compare$macrocall$2 expr_compare$macrocall$1$subexpression$2
expr_compare → ● expr_compare$macrocall$1
expr_is → ● expr_compare
expr_eq$macrocall$4 → ● expr_is
expr_eq$macrocall$1 → ● expr_eq$macrocall$4
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A op_eq token based on:
expr_eq$macrocall$2$macrocall$2$subexpression$1 → ● %op_eq
expr_eq$macrocall$2$macrocall$2 → ● expr_eq$macrocall$2$macrocall$2$subexpression$1
expr_eq$macrocall$2$macrocall$1$macrocall$2 → ● expr_eq$macrocall$2$macrocall$2
expr_eq$macrocall$2$macrocall$1$macrocall$1 → ● expr_eq$macrocall$2$macrocall$1$macrocall$2
expr_eq$macrocall$2$macrocall$1 → ● expr_eq$macrocall$2$macrocall$1$macrocall$1
expr_eq$macrocall$2 → ● expr_eq$macrocall$2$macrocall$1
expr_eq$macrocall$1 → expr_eq$macrocall$1$subexpression$1 ● expr_eq$macrocall$2 expr_eq$macrocall$1$subexpression$2
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A op_neq token based on:
expr_eq$macrocall$2$macrocall$2$subexpression$1 → ● %op_neq
expr_eq$macrocall$2$macrocall$2 → ● expr_eq$macrocall$2$macrocall$2$subexpression$1
expr_eq$macrocall$2$macrocall$1$macrocall$2 → ● expr_eq$macrocall$2$macrocall$2
expr_eq$macrocall$2$macrocall$1$macrocall$1 → ● expr_eq$macrocall$2$macrocall$1$macrocall$2
expr_eq$macrocall$2$macrocall$1 → ● expr_eq$macrocall$2$macrocall$1$macrocall$1
expr_eq$macrocall$2 → ● expr_eq$macrocall$2$macrocall$1
expr_eq$macrocall$1 → expr_eq$macrocall$1$subexpression$1 ● expr_eq$macrocall$2 expr_eq$macrocall$1$subexpression$2
expr_eq → ● expr_eq$macrocall$1
expr_not$macrocall$4 → ● expr_eq
expr_not$macrocall$1 → ● expr_not$macrocall$4
expr_not → ● expr_not$macrocall$1
expr_and$macrocall$4 → ● expr_not
expr_and$macrocall$1 → ● expr_and$macrocall$4
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A kw_and token based on:
expr_and$macrocall$2$macrocall$2 → ● %kw_and
expr_and$macrocall$2$macrocall$1 → ● expr_and$macrocall$2$macrocall$2
expr_and$macrocall$2 → ● expr_and$macrocall$2$macrocall$1
expr_and$macrocall$1 → expr_and$macrocall$1$subexpression$1 ● expr_and$macrocall$2 expr_and$macrocall$1$subexpression$2
expr_and → ● expr_and$macrocall$1
expr_or$macrocall$4 → ● expr_and
expr_or$macrocall$1 → ● expr_or$macrocall$4
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar
A kw_or token based on:
expr_or$macrocall$2$macrocall$2 → ● %kw_or
expr_or$macrocall$2$macrocall$1 → ● expr_or$macrocall$2$macrocall$2
expr_or$macrocall$2 → ● expr_or$macrocall$2$macrocall$1
expr_or$macrocall$1 → expr_or$macrocall$1$subexpression$1 ● expr_or$macrocall$2 expr_or$macrocall$1$subexpression$2
expr_or → ● expr_or$macrocall$1
expr_nostar → ● expr_or
expr → ● expr_nostar

  at Parser.feed (node_modules/nearley/lib/nearley.js:343:27)
  at doParse (src/syntax/spec-utils.ts:165:24)
  at /Users/gthb/git/pgsql-ast-parser/src/syntax/spec-utils.ts:182:56
  at tracking (src/lexer.ts:190:16)
  at Context.<anonymous> (src/syntax/spec-utils.ts:182:49)
  at processImmediate (node:internal/timers:476:21)
@gthb gthb changed the title Expression that subtracts a literal number fails to parse Expression that subtracts a literal number without space fails to parse Aug 8, 2023
@gthb
Copy link
Contributor Author

gthb commented Aug 8, 2023

I tried out just moving the lexer definitions of int and float to directly below the op_minus definition:

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

That makes some tests fail:

  1. A lexer test explicitly wants a { type: "float", value: "-.1" }. That test could simply be changed to expect the { type: 'op_minus' } followed by a positive literal, resulting from the above change.
  2. SET TIME ZONE -9 doesn't parse because it expects only a numeric literal; this is presumably simple to allow with a parse rule.
  3. Several expression tests expect { type: "numeric", ...} AST nodes with negative values. I think a { type: "unary", ... } result with a positive-number argument is just as valid, but if that change is undesired, this probably needs to be transformed as a special case.
  4. The test checkInvalidExpr('42.-51'); fails — but I think that test itself is wrong, because that expression is valid: the psql command executes SELECT 42.-51 just fine.
  5. The tests for a->>-1 and a.b->-1 hit the syntax error Unexpected op_minus token: "-". I bet that can be fixed with another case in the parse rule.

@gthb gthb linked a pull request Feb 27, 2024 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant