Jump to content

Need help with Bison/Yacc parser


TheDcoder
 Share

Recommended Posts

Hello, many of you already know I'm working on a new programming language and I need some help to figure out an issue in the parser. I'm posting it here with the hope that someone knowledgeable enough can point out the solution and to also document this issue as I may forget the details if I don't make progress and set it aside.

Here's the parser:

/* 
 * This file is part of EasyCodeIt.
 * 
 * Copyright (C) 2021 TheDcoder <TheDcoder@protonmail.com>
 * 
 * EasyCodeIt is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

%define parse.trace

%code requires {
	#define _GNU_SOURCE /* Required to enable (v)asprintf */
	#include <stdbool.h>
	#include "parser/tree.h"
	#include "parser/parser_internal.h"
}

%union {
	double num;
	struct {
		char *str;
		size_t len;
	} str;
	bool boolean;
	struct Expression expr;
	struct ExpressionList expr_list;
}

%token UNKNOWN

%token WS
%token NL '\n'

%token COMMENT
%token DIRECTIVE

%token <num> NUMBER
%token <str> STRING
%token <boolean> BOOL

%token <str> WORD

%token <str> MACRO
%token <str> VARIABLE

%token OPERATOR
%token BRACKET
%token DOT
%token COMMA

 /* Keywords */
%token K_DIM "Dim"
%token K_LOCAL "Local"
%token K_GLOBAL "Global"
%token K_ENUM "Enum"
%token K_CONST "Const"
%token K_STATIC "Static"
%token K_CONTINUE_CASE "ContinueCase"
%token K_CONTINUE_LOOP "ContinueLoop"
%token K_DEFAULT "Default"
%token K_NULL "Null"
%token K_DO "Do"
%token K_UNTIL "Until"
%token K_WHILE "While"
%token K_END_WHILE "WEnd"
%token K_FOR "For"
%token K_IN "In"
%token K_TO "To"
%token K_STEP "Step"
%token K_NEXT "Next"
%token K_EXIT "Exit"
%token K_EXITLOOP "ExitLoop"
%token K_FUNC "Func"
%token K_RETURN "Return"
%token K_END_FUNC "EndFunc"
%token K_IF "If"
%token K_ELSE "Else"
%token K_ELSE_IF "ElseIf"
%token K_END_IF "EndIf"
%token K_REDIM "ReDim"
%token K_SELECT "Select"
%token K_SWITCH "Switch"
%token K_CASE "Case"
%token K_END_SELECT "EndSelect"
%token K_END_SWITCH "EndSwitch"

 /* Operators */
%precedence '?'
%precedence ':'
%left AND "And" OR "Or"
%left LT '<' GT '>' LTE "<=" GTE ">=" EQU '=' NEQ "<>" SEQU "=="
%left '&'
%left '+' '-'
%left '*' '/'
%left '^'
%left NOT "Not"
%precedence INVERSION
%precedence '.'
 /* WORKAROUND: Bison can't handle "sandwich" operators which surround the 2nd part of a binary expression */
%precedence '['
%precedence '('
%precedence GROUPING

%type <expr> expression
%type <expr_list> expression_list

%{
int yylex();
void yyerror(const char *s);
%}

%%

top: /* nothing */
	| expression_list {print_expr($1.expression);}

expression:
	  BOOL {$$ = expr_from_prim(&(struct Primitive){.type = PRI_BOOLEAN, .boolean = $1});}
	| NUMBER {$$ = expr_from_prim(&(struct Primitive){.type = PRI_NUMBER, .number = $1});}
	| STRING {$$ = expr_from_str($1.str, $1.len);}
	| WORD {$$ = expr_from_ident($1.str, $1.len);}
	| MACRO {$$ = expr_from_ident($1.str, $1.len);}
	| VARIABLE {$$ = expr_from_ident($1.str, $1.len);}
	| expression '?' expression ':' expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3, &$5}, 3, OP_CON);}
	| expression "And" expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_AND);}
	| expression "Or" expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_OR);}
	| expression '<' expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_LT);}
	| expression '>' expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_GT);}
	| expression '=' expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_EQU);}
	| expression "<=" expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_LTE);}
	| expression ">=" expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_GTE);}
	| expression "<>" expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_NEQ);}
	| expression "==" expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_SEQU);}
	| expression '&' expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_CAT);}
	| expression '+' expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_ADD);}
	| expression '-' expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_SUB);}
	| expression '*' expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_MUL);}
	| expression '/' expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_DIV);}
	| expression '^' expression {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_EXP);}
	| "Not" expression {$$ = expr_from_expr((struct Expression *[]){&$2}, 1, OP_NOT);}
	| '-' expression %prec INVERSION {$$ = expr_from_expr((struct Expression *[]){&$2}, 1, OP_INV);}
	/*| expression '.' WORD {$$ = expr_from_expr((struct Expression *[]){&$1, &(struct Expression){expr_from_ident($3.str, $3.len)}}, 2, OP_ACC);}*/
	| expression '.' WORD {
		struct Expression ident_expr = expr_from_ident($3.str, $3.len);
		$$ = expr_from_expr((struct Expression *[]){&$1, &ident_expr}, 2, OP_ACC);
	}
	| expression '[' expression ']' {$$ = expr_from_expr((struct Expression *[]){&$1, &$3}, 2, OP_ACC);}
	| expression '(' expression_list ')' {$$ = expr_from_call(&$1, &$3);}
	| expression '(' ')' {$$ = expr_from_call(&$1, NULL);}
	/* | expression '(' expression_list ')' %prec CALL {$$ = expr_from_call(&$1, &$3);}
	| expression '(' ')' %prec CALL {$$ = expr_from_call(&$1, NULL);} */
	| '(' expression ')' %prec GROUPING {$$ = $2;}

expression_list:
	/* expression {$$ = (struct ExpressionList){.expression = , .list = NULL};}
	| expression ',' expression_list {$$ = (struct ExpressionList){.expression = &$1, .list = &$3};} */
	  expression {$$ = exprlist_from_expr(&$1, NULL);}
	/* | expression ',' expression_list {$$ = exprlist_from_expr(&$1, &$3);}
	| expression '\n' expression_list {$$ = exprlist_from_expr(&$1, &$3);} */
	| expression_list ',' expression {$$ = exprlist_from_expr(&$3, &$1);}
	| expression_list '\n' expression {$$ = exprlist_from_expr(&$3, &$1);}

%%

#include "parser/parser.c"

And the "parser output" by Bison:

Terminals unused in grammar

    UNKNOWN
    WS
    NL
    COMMENT
    DIRECTIVE
    OPERATOR
    BRACKET
    DOT
    COMMA
    "Dim"
    "Local"
    "Global"
    "Enum"
    "Const"
    "Static"
    "ContinueCase"
    "ContinueLoop"
    "Default"
    "Null"
    "Do"
    "Until"
    "While"
    "WEnd"
    "For"
    "In"
    "To"
    "Step"
    "Next"
    "Exit"
    "ExitLoop"
    "Func"
    "Return"
    "EndFunc"
    "If"
    "Else"
    "ElseIf"
    "EndIf"
    "ReDim"
    "Select"
    "Switch"
    "Case"
    "EndSelect"
    "EndSwitch"
    AND
    OR
    LT
    GT
    LTE
    GTE
    EQU
    NEQ
    SEQU
    NOT


Grammar

    0 $accept: top $end

    1 top: ε
    2    | expression_list

    3 expression: BOOL
    4           | NUMBER
    5           | STRING
    6           | WORD
    7           | MACRO
    8           | VARIABLE
    9           | expression '?' expression ':' expression
   10           | expression "And" expression
   11           | expression "Or" expression
   12           | expression '<' expression
   13           | expression '>' expression
   14           | expression '=' expression
   15           | expression "<=" expression
   16           | expression ">=" expression
   17           | expression "<>" expression
   18           | expression "==" expression
   19           | expression '&' expression
   20           | expression '+' expression
   21           | expression '-' expression
   22           | expression '*' expression
   23           | expression '/' expression
   24           | expression '^' expression
   25           | "Not" expression
   26           | '-' expression
   27           | expression '.' WORD
   28           | expression '[' expression ']'
   29           | expression '(' expression_list ')'
   30           | expression '(' ')'
   31           | '(' expression ')'

   32 expression_list: expression
   33                | expression_list ',' expression
   34                | expression_list '\n' expression


Terminals, with rules where they appear

    $end (0) 0
    '\n' (10) 34
    '&' (38) 19
    '(' (40) 29 30 31
    ')' (41) 29 30 31
    '*' (42) 22
    '+' (43) 20
    ',' (44) 33
    '-' (45) 21 26
    '.' (46) 27
    '/' (47) 23
    ':' (58) 9
    '<' (60) 12
    '=' (61) 14
    '>' (62) 13
    '?' (63) 9
    '[' (91) 28
    ']' (93) 28
    '^' (94) 24
    error (256)
    UNKNOWN (258)
    WS (259)
    NL (260)
    COMMENT (261)
    DIRECTIVE (262)
    NUMBER <num> (263) 4
    STRING <str> (264) 5
    BOOL <boolean> (265) 3
    WORD <str> (266) 6 27
    MACRO <str> (267) 7
    VARIABLE <str> (268) 8
    OPERATOR (269)
    BRACKET (270)
    DOT (271)
    COMMA (272)
    "Dim" (273)
    "Local" (274)
    "Global" (275)
    "Enum" (276)
    "Const" (277)
    "Static" (278)
    "ContinueCase" (279)
    "ContinueLoop" (280)
    "Default" (281)
    "Null" (282)
    "Do" (283)
    "Until" (284)
    "While" (285)
    "WEnd" (286)
    "For" (287)
    "In" (288)
    "To" (289)
    "Step" (290)
    "Next" (291)
    "Exit" (292)
    "ExitLoop" (293)
    "Func" (294)
    "Return" (295)
    "EndFunc" (296)
    "If" (297)
    "Else" (298)
    "ElseIf" (299)
    "EndIf" (300)
    "ReDim" (301)
    "Select" (302)
    "Switch" (303)
    "Case" (304)
    "EndSelect" (305)
    "EndSwitch" (306)
    AND (307)
    "And" (308) 10
    OR (309)
    "Or" (310) 11
    LT (311)
    GT (312)
    LTE (313)
    "<=" (314) 15
    GTE (315)
    ">=" (316) 16
    EQU (317)
    NEQ (318)
    "<>" (319) 17
    SEQU (320)
    "==" (321) 18
    NOT (322)
    "Not" (323) 25
    INVERSION (324)
    GROUPING (325)


Nonterminals, with rules where they appear

    $accept (89)
        on left: 0
    top (90)
        on left: 1 2
        on right: 0
    expression <expr> (91)
        on left: 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
        on right: 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
    expression_list <expr_list> (92)
        on left: 32 33 34
        on right: 2 29 33 34


State 0

    0 $accept: • top $end

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    $default  reduce using rule 1 (top)

    top              go to state 10
    expression       go to state 11
    expression_list  go to state 12


State 1

    4 expression: NUMBER •

    $default  reduce using rule 4 (expression)


State 2

    5 expression: STRING •

    $default  reduce using rule 5 (expression)


State 3

    3 expression: BOOL •

    $default  reduce using rule 3 (expression)


State 4

    6 expression: WORD •

    $default  reduce using rule 6 (expression)


State 5

    7 expression: MACRO •

    $default  reduce using rule 7 (expression)


State 6

    8 expression: VARIABLE •

    $default  reduce using rule 8 (expression)


State 7

   26 expression: '-' • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 13


State 8

   25 expression: "Not" • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 14


State 9

   31 expression: '(' • expression ')'

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 15


State 10

    0 $accept: top • $end

    $end  shift, and go to state 16


State 11

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'
   32 expression_list: expression •

    '?'    shift, and go to state 17
    "And"  shift, and go to state 18
    "Or"   shift, and go to state 19
    '<'    shift, and go to state 20
    '>'    shift, and go to state 21
    "<="   shift, and go to state 22
    ">="   shift, and go to state 23
    '='    shift, and go to state 24
    "<>"   shift, and go to state 25
    "=="   shift, and go to state 26
    '&'    shift, and go to state 27
    '+'    shift, and go to state 28
    '-'    shift, and go to state 29
    '*'    shift, and go to state 30
    '/'    shift, and go to state 31
    '^'    shift, and go to state 32
    '.'    shift, and go to state 33
    '['    shift, and go to state 34
    '('    shift, and go to state 35

    $default  reduce using rule 32 (expression_list)


State 12

    2 top: expression_list •
   33 expression_list: expression_list • ',' expression
   34                | expression_list • '\n' expression

    '\n'  shift, and go to state 36
    ','   shift, and go to state 37

    $default  reduce using rule 2 (top)


State 13

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   26           | '-' expression •
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '.'  shift, and go to state 33
    '['  shift, and go to state 34
    '('  shift, and go to state 35

    $default  reduce using rule 26 (expression)


State 14

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   25           | "Not" expression •
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '.'  shift, and go to state 33
    '['  shift, and go to state 34
    '('  shift, and go to state 35

    $default  reduce using rule 25 (expression)


State 15

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'
   31           | '(' expression • ')'

    '?'    shift, and go to state 17
    "And"  shift, and go to state 18
    "Or"   shift, and go to state 19
    '<'    shift, and go to state 20
    '>'    shift, and go to state 21
    "<="   shift, and go to state 22
    ">="   shift, and go to state 23
    '='    shift, and go to state 24
    "<>"   shift, and go to state 25
    "=="   shift, and go to state 26
    '&'    shift, and go to state 27
    '+'    shift, and go to state 28
    '-'    shift, and go to state 29
    '*'    shift, and go to state 30
    '/'    shift, and go to state 31
    '^'    shift, and go to state 32
    '.'    shift, and go to state 33
    '['    shift, and go to state 34
    '('    shift, and go to state 35
    ')'    shift, and go to state 38


State 16

    0 $accept: top $end •

    $default  accept


State 17

    9 expression: expression '?' • expression ':' expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 39


State 18

   10 expression: expression "And" • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 40


State 19

   11 expression: expression "Or" • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 41


State 20

   12 expression: expression '<' • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 42


State 21

   13 expression: expression '>' • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 43


State 22

   15 expression: expression "<=" • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 44


State 23

   16 expression: expression ">=" • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 45


State 24

   14 expression: expression '=' • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 46


State 25

   17 expression: expression "<>" • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 47


State 26

   18 expression: expression "==" • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 48


State 27

   19 expression: expression '&' • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 49


State 28

   20 expression: expression '+' • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 50


State 29

   21 expression: expression '-' • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 51


State 30

   22 expression: expression '*' • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 52


State 31

   23 expression: expression '/' • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 53


State 32

   24 expression: expression '^' • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 54


State 33

   27 expression: expression '.' • WORD

    WORD  shift, and go to state 55


State 34

   28 expression: expression '[' • expression ']'

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 56


State 35

   29 expression: expression '(' • expression_list ')'
   30           | expression '(' • ')'

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9
    ')'       shift, and go to state 57

    expression       go to state 11
    expression_list  go to state 58


State 36

   34 expression_list: expression_list '\n' • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 59


State 37

   33 expression_list: expression_list ',' • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 60


State 38

   31 expression: '(' expression ')' •

    $default  reduce using rule 31 (expression)


State 39

    9 expression: expression • '?' expression ':' expression
    9           | expression '?' expression • ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '?'    shift, and go to state 17
    ':'    shift, and go to state 61
    "And"  shift, and go to state 18
    "Or"   shift, and go to state 19
    '<'    shift, and go to state 20
    '>'    shift, and go to state 21
    "<="   shift, and go to state 22
    ">="   shift, and go to state 23
    '='    shift, and go to state 24
    "<>"   shift, and go to state 25
    "=="   shift, and go to state 26
    '&'    shift, and go to state 27
    '+'    shift, and go to state 28
    '-'    shift, and go to state 29
    '*'    shift, and go to state 30
    '/'    shift, and go to state 31
    '^'    shift, and go to state 32
    '.'    shift, and go to state 33
    '['    shift, and go to state 34
    '('    shift, and go to state 35


State 40

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   10           | expression "And" expression •
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '<'   shift, and go to state 20
    '>'   shift, and go to state 21
    "<="  shift, and go to state 22
    ">="  shift, and go to state 23
    '='   shift, and go to state 24
    "<>"  shift, and go to state 25
    "=="  shift, and go to state 26
    '&'   shift, and go to state 27
    '+'   shift, and go to state 28
    '-'   shift, and go to state 29
    '*'   shift, and go to state 30
    '/'   shift, and go to state 31
    '^'   shift, and go to state 32
    '.'   shift, and go to state 33
    '['   shift, and go to state 34
    '('   shift, and go to state 35

    $default  reduce using rule 10 (expression)


State 41

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   11           | expression "Or" expression •
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '<'   shift, and go to state 20
    '>'   shift, and go to state 21
    "<="  shift, and go to state 22
    ">="  shift, and go to state 23
    '='   shift, and go to state 24
    "<>"  shift, and go to state 25
    "=="  shift, and go to state 26
    '&'   shift, and go to state 27
    '+'   shift, and go to state 28
    '-'   shift, and go to state 29
    '*'   shift, and go to state 30
    '/'   shift, and go to state 31
    '^'   shift, and go to state 32
    '.'   shift, and go to state 33
    '['   shift, and go to state 34
    '('   shift, and go to state 35

    $default  reduce using rule 11 (expression)


State 42

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   12           | expression '<' expression •
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '&'  shift, and go to state 27
    '+'  shift, and go to state 28
    '-'  shift, and go to state 29
    '*'  shift, and go to state 30
    '/'  shift, and go to state 31
    '^'  shift, and go to state 32
    '.'  shift, and go to state 33
    '['  shift, and go to state 34
    '('  shift, and go to state 35

    $default  reduce using rule 12 (expression)


State 43

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   13           | expression '>' expression •
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '&'  shift, and go to state 27
    '+'  shift, and go to state 28
    '-'  shift, and go to state 29
    '*'  shift, and go to state 30
    '/'  shift, and go to state 31
    '^'  shift, and go to state 32
    '.'  shift, and go to state 33
    '['  shift, and go to state 34
    '('  shift, and go to state 35

    $default  reduce using rule 13 (expression)


State 44

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   15           | expression "<=" expression •
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '&'  shift, and go to state 27
    '+'  shift, and go to state 28
    '-'  shift, and go to state 29
    '*'  shift, and go to state 30
    '/'  shift, and go to state 31
    '^'  shift, and go to state 32
    '.'  shift, and go to state 33
    '['  shift, and go to state 34
    '('  shift, and go to state 35

    $default  reduce using rule 15 (expression)


State 45

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   16           | expression ">=" expression •
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '&'  shift, and go to state 27
    '+'  shift, and go to state 28
    '-'  shift, and go to state 29
    '*'  shift, and go to state 30
    '/'  shift, and go to state 31
    '^'  shift, and go to state 32
    '.'  shift, and go to state 33
    '['  shift, and go to state 34
    '('  shift, and go to state 35

    $default  reduce using rule 16 (expression)


State 46

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   14           | expression '=' expression •
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '&'  shift, and go to state 27
    '+'  shift, and go to state 28
    '-'  shift, and go to state 29
    '*'  shift, and go to state 30
    '/'  shift, and go to state 31
    '^'  shift, and go to state 32
    '.'  shift, and go to state 33
    '['  shift, and go to state 34
    '('  shift, and go to state 35

    $default  reduce using rule 14 (expression)


State 47

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   17           | expression "<>" expression •
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '&'  shift, and go to state 27
    '+'  shift, and go to state 28
    '-'  shift, and go to state 29
    '*'  shift, and go to state 30
    '/'  shift, and go to state 31
    '^'  shift, and go to state 32
    '.'  shift, and go to state 33
    '['  shift, and go to state 34
    '('  shift, and go to state 35

    $default  reduce using rule 17 (expression)


State 48

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   18           | expression "==" expression •
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '&'  shift, and go to state 27
    '+'  shift, and go to state 28
    '-'  shift, and go to state 29
    '*'  shift, and go to state 30
    '/'  shift, and go to state 31
    '^'  shift, and go to state 32
    '.'  shift, and go to state 33
    '['  shift, and go to state 34
    '('  shift, and go to state 35

    $default  reduce using rule 18 (expression)


State 49

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   19           | expression '&' expression •
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '+'  shift, and go to state 28
    '-'  shift, and go to state 29
    '*'  shift, and go to state 30
    '/'  shift, and go to state 31
    '^'  shift, and go to state 32
    '.'  shift, and go to state 33
    '['  shift, and go to state 34
    '('  shift, and go to state 35

    $default  reduce using rule 19 (expression)


State 50

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   20           | expression '+' expression •
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '*'  shift, and go to state 30
    '/'  shift, and go to state 31
    '^'  shift, and go to state 32
    '.'  shift, and go to state 33
    '['  shift, and go to state 34
    '('  shift, and go to state 35

    $default  reduce using rule 20 (expression)


State 51

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   21           | expression '-' expression •
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '*'  shift, and go to state 30
    '/'  shift, and go to state 31
    '^'  shift, and go to state 32
    '.'  shift, and go to state 33
    '['  shift, and go to state 34
    '('  shift, and go to state 35

    $default  reduce using rule 21 (expression)


State 52

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   22           | expression '*' expression •
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '^'  shift, and go to state 32
    '.'  shift, and go to state 33
    '['  shift, and go to state 34
    '('  shift, and go to state 35

    $default  reduce using rule 22 (expression)


State 53

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   23           | expression '/' expression •
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '^'  shift, and go to state 32
    '.'  shift, and go to state 33
    '['  shift, and go to state 34
    '('  shift, and go to state 35

    $default  reduce using rule 23 (expression)


State 54

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   24           | expression '^' expression •
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '.'  shift, and go to state 33
    '['  shift, and go to state 34
    '('  shift, and go to state 35

    $default  reduce using rule 24 (expression)


State 55

   27 expression: expression '.' WORD •

    $default  reduce using rule 27 (expression)


State 56

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   28           | expression '[' expression • ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    '?'    shift, and go to state 17
    "And"  shift, and go to state 18
    "Or"   shift, and go to state 19
    '<'    shift, and go to state 20
    '>'    shift, and go to state 21
    "<="   shift, and go to state 22
    ">="   shift, and go to state 23
    '='    shift, and go to state 24
    "<>"   shift, and go to state 25
    "=="   shift, and go to state 26
    '&'    shift, and go to state 27
    '+'    shift, and go to state 28
    '-'    shift, and go to state 29
    '*'    shift, and go to state 30
    '/'    shift, and go to state 31
    '^'    shift, and go to state 32
    '.'    shift, and go to state 33
    '['    shift, and go to state 34
    '('    shift, and go to state 35
    ']'    shift, and go to state 62


State 57

   30 expression: expression '(' ')' •

    $default  reduce using rule 30 (expression)


State 58

   29 expression: expression '(' expression_list • ')'
   33 expression_list: expression_list • ',' expression
   34                | expression_list • '\n' expression

    '\n'  shift, and go to state 36
    ')'   shift, and go to state 63
    ','   shift, and go to state 37


State 59

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'
   34 expression_list: expression_list '\n' expression •

    '?'    shift, and go to state 17
    "And"  shift, and go to state 18
    "Or"   shift, and go to state 19
    '<'    shift, and go to state 20
    '>'    shift, and go to state 21
    "<="   shift, and go to state 22
    ">="   shift, and go to state 23
    '='    shift, and go to state 24
    "<>"   shift, and go to state 25
    "=="   shift, and go to state 26
    '&'    shift, and go to state 27
    '+'    shift, and go to state 28
    '-'    shift, and go to state 29
    '*'    shift, and go to state 30
    '/'    shift, and go to state 31
    '^'    shift, and go to state 32
    '.'    shift, and go to state 33
    '['    shift, and go to state 34
    '('    shift, and go to state 35

    $default  reduce using rule 34 (expression_list)


State 60

    9 expression: expression • '?' expression ':' expression
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'
   33 expression_list: expression_list ',' expression •

    '?'    shift, and go to state 17
    "And"  shift, and go to state 18
    "Or"   shift, and go to state 19
    '<'    shift, and go to state 20
    '>'    shift, and go to state 21
    "<="   shift, and go to state 22
    ">="   shift, and go to state 23
    '='    shift, and go to state 24
    "<>"   shift, and go to state 25
    "=="   shift, and go to state 26
    '&'    shift, and go to state 27
    '+'    shift, and go to state 28
    '-'    shift, and go to state 29
    '*'    shift, and go to state 30
    '/'    shift, and go to state 31
    '^'    shift, and go to state 32
    '.'    shift, and go to state 33
    '['    shift, and go to state 34
    '('    shift, and go to state 35

    $default  reduce using rule 33 (expression_list)


State 61

    9 expression: expression '?' expression ':' • expression

    NUMBER    shift, and go to state 1
    STRING    shift, and go to state 2
    BOOL      shift, and go to state 3
    WORD      shift, and go to state 4
    MACRO     shift, and go to state 5
    VARIABLE  shift, and go to state 6
    '-'       shift, and go to state 7
    "Not"     shift, and go to state 8
    '('       shift, and go to state 9

    expression  go to state 64


State 62

   28 expression: expression '[' expression ']' •

    $default  reduce using rule 28 (expression)


State 63

   29 expression: expression '(' expression_list ')' •

    $default  reduce using rule 29 (expression)


State 64

    9 expression: expression • '?' expression ':' expression
    9           | expression '?' expression ':' expression •
   10           | expression • "And" expression
   11           | expression • "Or" expression
   12           | expression • '<' expression
   13           | expression • '>' expression
   14           | expression • '=' expression
   15           | expression • "<=" expression
   16           | expression • ">=" expression
   17           | expression • "<>" expression
   18           | expression • "==" expression
   19           | expression • '&' expression
   20           | expression • '+' expression
   21           | expression • '-' expression
   22           | expression • '*' expression
   23           | expression • '/' expression
   24           | expression • '^' expression
   27           | expression • '.' WORD
   28           | expression • '[' expression ']'
   29           | expression • '(' expression_list ')'
   30           | expression • '(' ')'

    "And"  shift, and go to state 18
    "Or"   shift, and go to state 19
    '<'    shift, and go to state 20
    '>'    shift, and go to state 21
    "<="   shift, and go to state 22
    ">="   shift, and go to state 23
    '='    shift, and go to state 24
    "<>"   shift, and go to state 25
    "=="   shift, and go to state 26
    '&'    shift, and go to state 27
    '+'    shift, and go to state 28
    '-'    shift, and go to state 29
    '*'    shift, and go to state 30
    '/'    shift, and go to state 31
    '^'    shift, and go to state 32
    '.'    shift, and go to state 33
    '['    shift, and go to state 34
    '('    shift, and go to state 35

    $default  reduce using rule 9 (expression)

And finally a minimal reproduction of the issue I'm facing:

TheDcoder@arch /m/d/P/C/E/build (master)> eci 1\n2
Starting parse
Entering state 0
Stack now 0
Reading a token
Next token is token NUMBER ()
Shifting token NUMBER ()
Entering state 1
Stack now 0 1
Reducing stack by rule 4 (line 130):
   $1 = token NUMBER ()
-> $$ = nterm expression ()
Entering state 11
Stack now 0 11
Reading a token
Next token is token NL ()
Reducing stack by rule 32 (line 168):
   $1 = nterm expression ()
-> $$ = nterm expression_list ()
Entering state 12
Stack now 0 12
Next token is token NL ()
Reducing stack by rule 2 (line 126):
   $1 = nterm expression_list ()
{
    "op": "No Operation",
    "args": [
        1.0
    ]
}
-> $$ = nterm top ()
Entering state 10
Stack now 0 10
Next token is token NL ()
2: syntax error at 

Error: popping nterm top ()
Stack now 0
Cleanup: discarding lookahead token NL ()
Stack now 0

Now I will explain the issue:

I am trying to parse several different expressions and construct an "expression list" from them, however my parser immediately reduces the first expression to the "top" rule, but what I want is for it to make an "expression_list" which combines the following expression which is separated by a NL.

This fact can be observed in the debug output from the reproduction script parse attempt, after the parser enters state 12 it immediately uses rule 2 to reduce to "top", but what we want is for it to use rule 34 and reduce to another "expression_list".

The reason why I think this happens is because the reduction to top simply consumes less tokens and satisfies the parser, and as far as I can tell there is no way to force Bison to be "greedy" when reducing an "expression_list".

So I'm unsure how to proceed further, I think we have to change the parser but I do not know how. I tried some silly things (like making another "super_top" non-terminal etc.) but those don't compile and produce a ton of conflicts 😕

EasyCodeIt - A cross-platform AutoIt implementation - Fund the development! (GitHub will double your donations for a limited time)

DcodingTheWeb Forum - Follow for updates and Join for discussion

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...