aboutsummaryrefslogtreecommitdiff
path: root/ql/parser
diff options
context:
space:
mode:
Diffstat (limited to 'ql/parser')
-rw-r--r--ql/parser/__pycache__/lexer.cpython-35.pycbin0 -> 4275 bytes
-rw-r--r--ql/parser/__pycache__/metadata.cpython-35.pycbin0 -> 612 bytes
-rw-r--r--ql/parser/__pycache__/parser.cpython-35.pycbin0 -> 14851 bytes
-rw-r--r--ql/parser/__pycache__/parsetab.cpython-35.pycbin0 -> 12432 bytes
-rw-r--r--ql/parser/lexer.py153
-rw-r--r--ql/parser/metadata.py7
-rw-r--r--ql/parser/parser.out2214
-rw-r--r--ql/parser/parser.py319
-rw-r--r--ql/parser/parsetab.py76
9 files changed, 2769 insertions, 0 deletions
diff --git a/ql/parser/__pycache__/lexer.cpython-35.pyc b/ql/parser/__pycache__/lexer.cpython-35.pyc
new file mode 100644
index 0000000..f2d9220
--- /dev/null
+++ b/ql/parser/__pycache__/lexer.cpython-35.pyc
Binary files differ
diff --git a/ql/parser/__pycache__/metadata.cpython-35.pyc b/ql/parser/__pycache__/metadata.cpython-35.pyc
new file mode 100644
index 0000000..0f1f298
--- /dev/null
+++ b/ql/parser/__pycache__/metadata.cpython-35.pyc
Binary files differ
diff --git a/ql/parser/__pycache__/parser.cpython-35.pyc b/ql/parser/__pycache__/parser.cpython-35.pyc
new file mode 100644
index 0000000..6eb96b9
--- /dev/null
+++ b/ql/parser/__pycache__/parser.cpython-35.pyc
Binary files differ
diff --git a/ql/parser/__pycache__/parsetab.cpython-35.pyc b/ql/parser/__pycache__/parsetab.cpython-35.pyc
new file mode 100644
index 0000000..bd4db77
--- /dev/null
+++ b/ql/parser/__pycache__/parsetab.cpython-35.pyc
Binary files differ
diff --git a/ql/parser/lexer.py b/ql/parser/lexer.py
new file mode 100644
index 0000000..6e53f12
--- /dev/null
+++ b/ql/parser/lexer.py
@@ -0,0 +1,153 @@
+from re import findall
+
+from ply.lex import lex
+
+
+class QLLexer:
+ def __init__(self):
+ self.__errors = []
+ self.__lexer = None
+
+ @property
+ def lexer(self):
+ return self.__lexer
+
+ @property
+ def errors(self):
+ return self.__errors
+
+ def build(self):
+ self.__lexer = lex(module=self)
+
+ def tokenize(self, data):
+ self.__errors = []
+ self.lexer.input(data)
+ token = self.lexer.token()
+ tokens = [token]
+
+ while token:
+ token = self.lexer.token()
+ tokens.append(token)
+
+ return tokens
+
+ tokens = [
+ 'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'COLON',
+ 'ASSIGN',
+ 'EQUALS', 'NOT_EQUALS',
+ 'LESS_EQUALS', 'LESS_THAN', 'GREATER_EQUALS', 'GREATER_THAN',
+ 'AND', 'OR',
+ 'DOLLAR', 'RUBLE',
+ 'LEFT_BRACE', 'RIGHT_BRACE',
+ 'LEFT_BRACKET', 'RIGHT_BRACKET',
+ 'INTEGER_LITERAL', 'DECIMAL_LITERAL',
+ 'TRUE', 'FALSE',
+ 'DATE_LITERAL',
+ 'STRING_LITERAL',
+ 'IDENTIFIER',
+ ]
+
+ reserved_keywords = {
+ 'form': 'FORM',
+ 'if': 'IF',
+ 'not': 'NOT',
+
+ # Types
+ 'boolean': 'BOOLEAN',
+ 'date': 'DATE',
+ 'decimal': 'DECIMAL',
+ 'integer': 'INTEGER',
+ 'money': 'MONEY',
+ 'string': 'STRING',
+ }
+
+ tokens += list(reserved_keywords.values())
+
+ # Regular expression rules for simple tokens
+ t_ignore = ' \t'
+
+ t_PLUS = r'\+'
+ t_MINUS = r'-'
+ t_TIMES = r'\*'
+ t_DIVIDE = r'/'
+ t_COLON = r':'
+ t_ASSIGN = r'='
+
+ t_LESS_EQUALS = r'<='
+ t_LESS_THAN = r'<'
+ t_GREATER_EQUALS = r'>='
+ t_GREATER_THAN = r'>'
+ t_EQUALS = r'=='
+ t_NOT_EQUALS = r'!='
+ t_AND = r'&&'
+ t_OR = r'\|\|'
+
+ t_DOLLAR = r'\$'
+ t_RUBLE = r'\₽'
+
+ t_LEFT_BRACE = r'\{'
+ t_RIGHT_BRACE = r'\}'
+
+ t_LEFT_BRACKET = r'\('
+ t_RIGHT_BRACKET = r'\)'
+
+ # Literals
+ @staticmethod
+ def t_FALSE(token):
+ r'False'
+ token.value = False
+ return token
+
+ @staticmethod
+ def t_TRUE(token):
+ r'True'
+ token.value = True
+ return token
+
+ def t_DATE_LITERAL(self, token):
+ r'date\(\s*\d{1,2}\s*,\s*\d{1,2}\s*,\s*\d{1,4}\s*\)'
+
+ try:
+ token.value = findall(r'\d\d*', token.value)
+ return token
+ except SyntaxError:
+ self.errors.append('Invalid date.')
+
+ @staticmethod
+ def t_DECIMAL_LITERAL(token):
+ r'\d+[.]\d+'
+ token.value = token.value
+ return token
+
+ @staticmethod
+ def t_INTEGER_LITERAL(token):
+ r'\d+'
+ token.value = token.value
+ return token
+
+ @staticmethod
+ def t_STRING_LITERAL(token):
+ r'\"(.+?)\"'
+ token.value = token.value[1:-1]
+ return token
+
+ # Other
+ def t_IDENTIFIER(self, token):
+ r'[a-z][a-zA-Z_0-9]*'
+ token.type = self.reserved_keywords.get(token.value, 'IDENTIFIER')
+ return token
+
+ @staticmethod
+ def t_comment(token):
+ r'//.*'
+ pass
+
+ @staticmethod
+ def t_newline(token):
+ r'\n+'
+ token.lexer.lineno += len(token.value)
+
+ # Error handling
+ def t_error(self, token):
+ self.errors.append("Illegal character '%s'" % token.value[0])
+ token.lexer.skip(1)
diff --git a/ql/parser/metadata.py b/ql/parser/metadata.py
new file mode 100644
index 0000000..618b4ba
--- /dev/null
+++ b/ql/parser/metadata.py
@@ -0,0 +1,7 @@
+class Metadata:
+ def __init__(self, line):
+ self.__line = line
+
+ @property
+ def line(self):
+ return self.__line
diff --git a/ql/parser/parser.out b/ql/parser/parser.out
new file mode 100644
index 0000000..e1a1452
--- /dev/null
+++ b/ql/parser/parser.out
@@ -0,0 +1,2214 @@
+Created by PLY version 3.11 (http://www.dabeaz.com/ply)
+
+Grammar
+
+Rule 0 S' -> form
+Rule 1 form -> FORM IDENTIFIER block
+Rule 2 block -> LEFT_BRACE statements RIGHT_BRACE
+Rule 3 statements -> statement statements
+Rule 4 statements -> statement
+Rule 5 statement -> if
+Rule 6 statement -> question
+Rule 7 question -> STRING_LITERAL IDENTIFIER COLON type
+Rule 8 question -> STRING_LITERAL IDENTIFIER COLON type ASSIGN expression
+Rule 9 if -> IF condition block
+Rule 10 condition -> LEFT_BRACKET expression RIGHT_BRACKET
+Rule 11 expression -> LEFT_BRACKET expression RIGHT_BRACKET
+Rule 12 expression -> IDENTIFIER
+Rule 13 expression -> NOT expression
+Rule 14 expression -> MINUS expression
+Rule 15 expression -> expression AND expression
+Rule 16 expression -> expression OR expression
+Rule 17 expression -> expression PLUS expression
+Rule 18 expression -> expression MINUS expression
+Rule 19 expression -> expression TIMES expression
+Rule 20 expression -> expression DIVIDE expression
+Rule 21 expression -> expression EQUALS expression
+Rule 22 expression -> expression NOT_EQUALS expression
+Rule 23 expression -> expression LESS_EQUALS expression
+Rule 24 expression -> expression LESS_THAN expression
+Rule 25 expression -> expression GREATER_EQUALS expression
+Rule 26 expression -> expression GREATER_THAN expression
+Rule 27 expression -> FALSE
+Rule 28 expression -> TRUE
+Rule 29 expression -> DATE_LITERAL
+Rule 30 expression -> INTEGER_LITERAL
+Rule 31 expression -> DECIMAL_LITERAL
+Rule 32 expression -> currency DECIMAL_LITERAL
+Rule 33 expression -> currency INTEGER_LITERAL
+Rule 34 expression -> STRING_LITERAL
+Rule 35 currency -> DOLLAR
+Rule 36 currency -> RUBLE
+Rule 37 type -> BOOLEAN
+Rule 38 type -> DECIMAL
+Rule 39 type -> STRING
+Rule 40 type -> DATE
+Rule 41 type -> MONEY
+Rule 42 type -> INTEGER
+Rule 43 form -> FORM LEFT_BRACE
+Rule 44 form -> FORM IDENTIFIER LEFT_BRACE RIGHT_BRACE
+Rule 45 statement -> IF condition LEFT_BRACE RIGHT_BRACE
+Rule 46 condition -> LEFT_BRACKET RIGHT_BRACKET
+
+Terminals, with rules where they appear
+
+AND : 15
+ASSIGN : 8
+BOOLEAN : 37
+COLON : 7 8
+DATE : 40
+DATE_LITERAL : 29
+DECIMAL : 38
+DECIMAL_LITERAL : 31 32
+DIVIDE : 20
+DOLLAR : 35
+EQUALS : 21
+FALSE : 27
+FORM : 1 43 44
+GREATER_EQUALS : 25
+GREATER_THAN : 26
+IDENTIFIER : 1 7 8 12 44
+IF : 9 45
+INTEGER : 42
+INTEGER_LITERAL : 30 33
+LEFT_BRACE : 2 43 44 45
+LEFT_BRACKET : 10 11 46
+LESS_EQUALS : 23
+LESS_THAN : 24
+MINUS : 14 18
+MONEY : 41
+NOT : 13
+NOT_EQUALS : 22
+OR : 16
+PLUS : 17
+RIGHT_BRACE : 2 44 45
+RIGHT_BRACKET : 10 11 46
+RUBLE : 36
+STRING : 39
+STRING_LITERAL : 7 8 34
+TIMES : 19
+TRUE : 28
+error :
+
+Nonterminals, with rules where they appear
+
+block : 1 9
+condition : 9 45
+currency : 32 33
+expression : 8 10 11 13 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26
+form : 0
+if : 5
+question : 6
+statement : 3 4
+statements : 2 3
+type : 7 8
+
+Parsing method: LALR
+
+state 0
+
+ (0) S' -> . form
+ (1) form -> . FORM IDENTIFIER block
+ (43) form -> . FORM LEFT_BRACE
+ (44) form -> . FORM IDENTIFIER LEFT_BRACE RIGHT_BRACE
+
+ FORM shift and go to state 1
+
+ form shift and go to state 2
+
+state 1
+
+ (1) form -> FORM . IDENTIFIER block
+ (43) form -> FORM . LEFT_BRACE
+ (44) form -> FORM . IDENTIFIER LEFT_BRACE RIGHT_BRACE
+
+ IDENTIFIER shift and go to state 3
+ LEFT_BRACE shift and go to state 4
+
+
+state 2
+
+ (0) S' -> form .
+
+
+
+state 3
+
+ (1) form -> FORM IDENTIFIER . block
+ (44) form -> FORM IDENTIFIER . LEFT_BRACE RIGHT_BRACE
+ (2) block -> . LEFT_BRACE statements RIGHT_BRACE
+
+ LEFT_BRACE shift and go to state 5
+
+ block shift and go to state 6
+
+state 4
+
+ (43) form -> FORM LEFT_BRACE .
+
+ $end reduce using rule 43 (form -> FORM LEFT_BRACE .)
+
+
+state 5
+
+ (44) form -> FORM IDENTIFIER LEFT_BRACE . RIGHT_BRACE
+ (2) block -> LEFT_BRACE . statements RIGHT_BRACE
+ (3) statements -> . statement statements
+ (4) statements -> . statement
+ (5) statement -> . if
+ (6) statement -> . question
+ (45) statement -> . IF condition LEFT_BRACE RIGHT_BRACE
+ (9) if -> . IF condition block
+ (7) question -> . STRING_LITERAL IDENTIFIER COLON type
+ (8) question -> . STRING_LITERAL IDENTIFIER COLON type ASSIGN expression
+
+ RIGHT_BRACE shift and go to state 13
+ IF shift and go to state 11
+ STRING_LITERAL shift and go to state 12
+
+ if shift and go to state 7
+ question shift and go to state 8
+ statements shift and go to state 9
+ statement shift and go to state 10
+
+state 6
+
+ (1) form -> FORM IDENTIFIER block .
+
+ $end reduce using rule 1 (form -> FORM IDENTIFIER block .)
+
+
+state 7
+
+ (5) statement -> if .
+
+ IF reduce using rule 5 (statement -> if .)
+ STRING_LITERAL reduce using rule 5 (statement -> if .)
+ RIGHT_BRACE reduce using rule 5 (statement -> if .)
+
+
+state 8
+
+ (6) statement -> question .
+
+ IF reduce using rule 6 (statement -> question .)
+ STRING_LITERAL reduce using rule 6 (statement -> question .)
+ RIGHT_BRACE reduce using rule 6 (statement -> question .)
+
+
+state 9
+
+ (2) block -> LEFT_BRACE statements . RIGHT_BRACE
+
+ RIGHT_BRACE shift and go to state 14
+
+
+state 10
+
+ (3) statements -> statement . statements
+ (4) statements -> statement .
+ (3) statements -> . statement statements
+ (4) statements -> . statement
+ (5) statement -> . if
+ (6) statement -> . question
+ (45) statement -> . IF condition LEFT_BRACE RIGHT_BRACE
+ (9) if -> . IF condition block
+ (7) question -> . STRING_LITERAL IDENTIFIER COLON type
+ (8) question -> . STRING_LITERAL IDENTIFIER COLON type ASSIGN expression
+
+ RIGHT_BRACE reduce using rule 4 (statements -> statement .)
+ IF shift and go to state 11
+ STRING_LITERAL shift and go to state 12
+
+ if shift and go to state 7
+ question shift and go to state 8
+ statements shift and go to state 15
+ statement shift and go to state 10
+
+state 11
+
+ (45) statement -> IF . condition LEFT_BRACE RIGHT_BRACE
+ (9) if -> IF . condition block
+ (10) condition -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (46) condition -> . LEFT_BRACKET RIGHT_BRACKET
+
+ LEFT_BRACKET shift and go to state 17
+
+ condition shift and go to state 16
+
+state 12
+
+ (7) question -> STRING_LITERAL . IDENTIFIER COLON type
+ (8) question -> STRING_LITERAL . IDENTIFIER COLON type ASSIGN expression
+
+ IDENTIFIER shift and go to state 18
+
+
+state 13
+
+ (44) form -> FORM IDENTIFIER LEFT_BRACE RIGHT_BRACE .
+
+ $end reduce using rule 44 (form -> FORM IDENTIFIER LEFT_BRACE RIGHT_BRACE .)
+
+
+state 14
+
+ (2) block -> LEFT_BRACE statements RIGHT_BRACE .
+
+ IF reduce using rule 2 (block -> LEFT_BRACE statements RIGHT_BRACE .)
+ STRING_LITERAL reduce using rule 2 (block -> LEFT_BRACE statements RIGHT_BRACE .)
+ RIGHT_BRACE reduce using rule 2 (block -> LEFT_BRACE statements RIGHT_BRACE .)
+ $end reduce using rule 2 (block -> LEFT_BRACE statements RIGHT_BRACE .)
+
+
+state 15
+
+ (3) statements -> statement statements .
+
+ RIGHT_BRACE reduce using rule 3 (statements -> statement statements .)
+
+
+state 16
+
+ (45) statement -> IF condition . LEFT_BRACE RIGHT_BRACE
+ (9) if -> IF condition . block
+ (2) block -> . LEFT_BRACE statements RIGHT_BRACE
+
+ LEFT_BRACE shift and go to state 19
+
+ block shift and go to state 20
+
+state 17
+
+ (10) condition -> LEFT_BRACKET . expression RIGHT_BRACKET
+ (46) condition -> LEFT_BRACKET . RIGHT_BRACKET
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ RIGHT_BRACKET shift and go to state 21
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 33
+
+state 18
+
+ (7) question -> STRING_LITERAL IDENTIFIER . COLON type
+ (8) question -> STRING_LITERAL IDENTIFIER . COLON type ASSIGN expression
+
+ COLON shift and go to state 36
+
+
+state 19
+
+ (45) statement -> IF condition LEFT_BRACE . RIGHT_BRACE
+ (2) block -> LEFT_BRACE . statements RIGHT_BRACE
+ (3) statements -> . statement statements
+ (4) statements -> . statement
+ (5) statement -> . if
+ (6) statement -> . question
+ (45) statement -> . IF condition LEFT_BRACE RIGHT_BRACE
+ (9) if -> . IF condition block
+ (7) question -> . STRING_LITERAL IDENTIFIER COLON type
+ (8) question -> . STRING_LITERAL IDENTIFIER COLON type ASSIGN expression
+
+ RIGHT_BRACE shift and go to state 37
+ IF shift and go to state 11
+ STRING_LITERAL shift and go to state 12
+
+ if shift and go to state 7
+ question shift and go to state 8
+ statements shift and go to state 9
+ statement shift and go to state 10
+
+state 20
+
+ (9) if -> IF condition block .
+
+ IF reduce using rule 9 (if -> IF condition block .)
+ STRING_LITERAL reduce using rule 9 (if -> IF condition block .)
+ RIGHT_BRACE reduce using rule 9 (if -> IF condition block .)
+
+
+state 21
+
+ (46) condition -> LEFT_BRACKET RIGHT_BRACKET .
+
+ LEFT_BRACE reduce using rule 46 (condition -> LEFT_BRACKET RIGHT_BRACKET .)
+
+
+state 22
+
+ (32) expression -> currency . DECIMAL_LITERAL
+ (33) expression -> currency . INTEGER_LITERAL
+
+ DECIMAL_LITERAL shift and go to state 38
+ INTEGER_LITERAL shift and go to state 39
+
+
+state 23
+
+ (36) currency -> RUBLE .
+
+ DECIMAL_LITERAL reduce using rule 36 (currency -> RUBLE .)
+ INTEGER_LITERAL reduce using rule 36 (currency -> RUBLE .)
+
+
+state 24
+
+ (29) expression -> DATE_LITERAL .
+
+ AND reduce using rule 29 (expression -> DATE_LITERAL .)
+ OR reduce using rule 29 (expression -> DATE_LITERAL .)
+ PLUS reduce using rule 29 (expression -> DATE_LITERAL .)
+ MINUS reduce using rule 29 (expression -> DATE_LITERAL .)
+ TIMES reduce using rule 29 (expression -> DATE_LITERAL .)
+ DIVIDE reduce using rule 29 (expression -> DATE_LITERAL .)
+ EQUALS reduce using rule 29 (expression -> DATE_LITERAL .)
+ NOT_EQUALS reduce using rule 29 (expression -> DATE_LITERAL .)
+ LESS_EQUALS reduce using rule 29 (expression -> DATE_LITERAL .)
+ LESS_THAN reduce using rule 29 (expression -> DATE_LITERAL .)
+ GREATER_EQUALS reduce using rule 29 (expression -> DATE_LITERAL .)
+ GREATER_THAN reduce using rule 29 (expression -> DATE_LITERAL .)
+ IF reduce using rule 29 (expression -> DATE_LITERAL .)
+ STRING_LITERAL reduce using rule 29 (expression -> DATE_LITERAL .)
+ RIGHT_BRACE reduce using rule 29 (expression -> DATE_LITERAL .)
+ RIGHT_BRACKET reduce using rule 29 (expression -> DATE_LITERAL .)
+
+
+state 25
+
+ (14) expression -> MINUS . expression
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 40
+
+state 26
+
+ (30) expression -> INTEGER_LITERAL .
+
+ AND reduce using rule 30 (expression -> INTEGER_LITERAL .)
+ OR reduce using rule 30 (expression -> INTEGER_LITERAL .)
+ PLUS reduce using rule 30 (expression -> INTEGER_LITERAL .)
+ MINUS reduce using rule 30 (expression -> INTEGER_LITERAL .)
+ TIMES reduce using rule 30 (expression -> INTEGER_LITERAL .)
+ DIVIDE reduce using rule 30 (expression -> INTEGER_LITERAL .)
+ EQUALS reduce using rule 30 (expression -> INTEGER_LITERAL .)
+ NOT_EQUALS reduce using rule 30 (expression -> INTEGER_LITERAL .)
+ LESS_EQUALS reduce using rule 30 (expression -> INTEGER_LITERAL .)
+ LESS_THAN reduce using rule 30 (expression -> INTEGER_LITERAL .)
+ GREATER_EQUALS reduce using rule 30 (expression -> INTEGER_LITERAL .)
+ GREATER_THAN reduce using rule 30 (expression -> INTEGER_LITERAL .)
+ IF reduce using rule 30 (expression -> INTEGER_LITERAL .)
+ STRING_LITERAL reduce using rule 30 (expression -> INTEGER_LITERAL .)
+ RIGHT_BRACE reduce using rule 30 (expression -> INTEGER_LITERAL .)
+ RIGHT_BRACKET reduce using rule 30 (expression -> INTEGER_LITERAL .)
+
+
+state 27
+
+ (13) expression -> NOT . expression
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 41
+
+state 28
+
+ (34) expression -> STRING_LITERAL .
+
+ AND reduce using rule 34 (expression -> STRING_LITERAL .)
+ OR reduce using rule 34 (expression -> STRING_LITERAL .)
+ PLUS reduce using rule 34 (expression -> STRING_LITERAL .)
+ MINUS reduce using rule 34 (expression -> STRING_LITERAL .)
+ TIMES reduce using rule 34 (expression -> STRING_LITERAL .)
+ DIVIDE reduce using rule 34 (expression -> STRING_LITERAL .)
+ EQUALS reduce using rule 34 (expression -> STRING_LITERAL .)
+ NOT_EQUALS reduce using rule 34 (expression -> STRING_LITERAL .)
+ LESS_EQUALS reduce using rule 34 (expression -> STRING_LITERAL .)
+ LESS_THAN reduce using rule 34 (expression -> STRING_LITERAL .)
+ GREATER_EQUALS reduce using rule 34 (expression -> STRING_LITERAL .)
+ GREATER_THAN reduce using rule 34 (expression -> STRING_LITERAL .)
+ IF reduce using rule 34 (expression -> STRING_LITERAL .)
+ STRING_LITERAL reduce using rule 34 (expression -> STRING_LITERAL .)
+ RIGHT_BRACE reduce using rule 34 (expression -> STRING_LITERAL .)
+ RIGHT_BRACKET reduce using rule 34 (expression -> STRING_LITERAL .)
+
+
+state 29
+
+ (35) currency -> DOLLAR .
+
+ DECIMAL_LITERAL reduce using rule 35 (currency -> DOLLAR .)
+ INTEGER_LITERAL reduce using rule 35 (currency -> DOLLAR .)
+
+
+state 30
+
+ (11) expression -> LEFT_BRACKET . expression RIGHT_BRACKET
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 42
+
+state 31
+
+ (31) expression -> DECIMAL_LITERAL .
+
+ AND reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+ OR reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+ PLUS reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+ MINUS reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+ TIMES reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+ DIVIDE reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+ EQUALS reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+ NOT_EQUALS reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+ LESS_EQUALS reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+ LESS_THAN reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+ GREATER_EQUALS reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+ GREATER_THAN reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+ IF reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+ STRING_LITERAL reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+ RIGHT_BRACE reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+ RIGHT_BRACKET reduce using rule 31 (expression -> DECIMAL_LITERAL .)
+
+
+state 32
+
+ (28) expression -> TRUE .
+
+ AND reduce using rule 28 (expression -> TRUE .)
+ OR reduce using rule 28 (expression -> TRUE .)
+ PLUS reduce using rule 28 (expression -> TRUE .)
+ MINUS reduce using rule 28 (expression -> TRUE .)
+ TIMES reduce using rule 28 (expression -> TRUE .)
+ DIVIDE reduce using rule 28 (expression -> TRUE .)
+ EQUALS reduce using rule 28 (expression -> TRUE .)
+ NOT_EQUALS reduce using rule 28 (expression -> TRUE .)
+ LESS_EQUALS reduce using rule 28 (expression -> TRUE .)
+ LESS_THAN reduce using rule 28 (expression -> TRUE .)
+ GREATER_EQUALS reduce using rule 28 (expression -> TRUE .)
+ GREATER_THAN reduce using rule 28 (expression -> TRUE .)
+ IF reduce using rule 28 (expression -> TRUE .)
+ STRING_LITERAL reduce using rule 28 (expression -> TRUE .)
+ RIGHT_BRACE reduce using rule 28 (expression -> TRUE .)
+ RIGHT_BRACKET reduce using rule 28 (expression -> TRUE .)
+
+
+state 33
+
+ (10) condition -> LEFT_BRACKET expression . RIGHT_BRACKET
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ RIGHT_BRACKET shift and go to state 43
+ AND shift and go to state 52
+ OR shift and go to state 50
+ PLUS shift and go to state 44
+ MINUS shift and go to state 48
+ TIMES shift and go to state 49
+ DIVIDE shift and go to state 51
+ EQUALS shift and go to state 46
+ NOT_EQUALS shift and go to state 45
+ LESS_EQUALS shift and go to state 54
+ LESS_THAN shift and go to state 47
+ GREATER_EQUALS shift and go to state 55
+ GREATER_THAN shift and go to state 53
+
+
+state 34
+
+ (12) expression -> IDENTIFIER .
+
+ AND reduce using rule 12 (expression -> IDENTIFIER .)
+ OR reduce using rule 12 (expression -> IDENTIFIER .)
+ PLUS reduce using rule 12 (expression -> IDENTIFIER .)
+ MINUS reduce using rule 12 (expression -> IDENTIFIER .)
+ TIMES reduce using rule 12 (expression -> IDENTIFIER .)
+ DIVIDE reduce using rule 12 (expression -> IDENTIFIER .)
+ EQUALS reduce using rule 12 (expression -> IDENTIFIER .)
+ NOT_EQUALS reduce using rule 12 (expression -> IDENTIFIER .)
+ LESS_EQUALS reduce using rule 12 (expression -> IDENTIFIER .)
+ LESS_THAN reduce using rule 12 (expression -> IDENTIFIER .)
+ GREATER_EQUALS reduce using rule 12 (expression -> IDENTIFIER .)
+ GREATER_THAN reduce using rule 12 (expression -> IDENTIFIER .)
+ IF reduce using rule 12 (expression -> IDENTIFIER .)
+ STRING_LITERAL reduce using rule 12 (expression -> IDENTIFIER .)
+ RIGHT_BRACE reduce using rule 12 (expression -> IDENTIFIER .)
+ RIGHT_BRACKET reduce using rule 12 (expression -> IDENTIFIER .)
+
+
+state 35
+
+ (27) expression -> FALSE .
+
+ AND reduce using rule 27 (expression -> FALSE .)
+ OR reduce using rule 27 (expression -> FALSE .)
+ PLUS reduce using rule 27 (expression -> FALSE .)
+ MINUS reduce using rule 27 (expression -> FALSE .)
+ TIMES reduce using rule 27 (expression -> FALSE .)
+ DIVIDE reduce using rule 27 (expression -> FALSE .)
+ EQUALS reduce using rule 27 (expression -> FALSE .)
+ NOT_EQUALS reduce using rule 27 (expression -> FALSE .)
+ LESS_EQUALS reduce using rule 27 (expression -> FALSE .)
+ LESS_THAN reduce using rule 27 (expression -> FALSE .)
+ GREATER_EQUALS reduce using rule 27 (expression -> FALSE .)
+ GREATER_THAN reduce using rule 27 (expression -> FALSE .)
+ IF reduce using rule 27 (expression -> FALSE .)
+ STRING_LITERAL reduce using rule 27 (expression -> FALSE .)
+ RIGHT_BRACE reduce using rule 27 (expression -> FALSE .)
+ RIGHT_BRACKET reduce using rule 27 (expression -> FALSE .)
+
+
+state 36
+
+ (7) question -> STRING_LITERAL IDENTIFIER COLON . type
+ (8) question -> STRING_LITERAL IDENTIFIER COLON . type ASSIGN expression
+ (37) type -> . BOOLEAN
+ (38) type -> . DECIMAL
+ (39) type -> . STRING
+ (40) type -> . DATE
+ (41) type -> . MONEY
+ (42) type -> . INTEGER
+
+ BOOLEAN shift and go to state 62
+ DECIMAL shift and go to state 57
+ STRING shift and go to state 58
+ DATE shift and go to state 56
+ MONEY shift and go to state 60
+ INTEGER shift and go to state 61
+
+ type shift and go to state 59
+
+state 37
+
+ (45) statement -> IF condition LEFT_BRACE RIGHT_BRACE .
+
+ IF reduce using rule 45 (statement -> IF condition LEFT_BRACE RIGHT_BRACE .)
+ STRING_LITERAL reduce using rule 45 (statement -> IF condition LEFT_BRACE RIGHT_BRACE .)
+ RIGHT_BRACE reduce using rule 45 (statement -> IF condition LEFT_BRACE RIGHT_BRACE .)
+
+
+state 38
+
+ (32) expression -> currency DECIMAL_LITERAL .
+
+ AND reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+ OR reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+ PLUS reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+ MINUS reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+ TIMES reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+ DIVIDE reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+ EQUALS reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+ NOT_EQUALS reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+ LESS_EQUALS reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+ LESS_THAN reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+ GREATER_EQUALS reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+ GREATER_THAN reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+ IF reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+ STRING_LITERAL reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+ RIGHT_BRACE reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+ RIGHT_BRACKET reduce using rule 32 (expression -> currency DECIMAL_LITERAL .)
+
+
+state 39
+
+ (33) expression -> currency INTEGER_LITERAL .
+
+ AND reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+ OR reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+ PLUS reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+ MINUS reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+ TIMES reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+ DIVIDE reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+ EQUALS reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+ NOT_EQUALS reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+ LESS_EQUALS reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+ LESS_THAN reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+ GREATER_EQUALS reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+ GREATER_THAN reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+ IF reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+ STRING_LITERAL reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+ RIGHT_BRACE reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+ RIGHT_BRACKET reduce using rule 33 (expression -> currency INTEGER_LITERAL .)
+
+
+state 40
+
+ (14) expression -> MINUS expression .
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ AND reduce using rule 14 (expression -> MINUS expression .)
+ OR reduce using rule 14 (expression -> MINUS expression .)
+ PLUS reduce using rule 14 (expression -> MINUS expression .)
+ MINUS reduce using rule 14 (expression -> MINUS expression .)
+ EQUALS reduce using rule 14 (expression -> MINUS expression .)
+ NOT_EQUALS reduce using rule 14 (expression -> MINUS expression .)
+ LESS_EQUALS reduce using rule 14 (expression -> MINUS expression .)
+ LESS_THAN reduce using rule 14 (expression -> MINUS expression .)
+ GREATER_EQUALS reduce using rule 14 (expression -> MINUS expression .)
+ GREATER_THAN reduce using rule 14 (expression -> MINUS expression .)
+ IF reduce using rule 14 (expression -> MINUS expression .)
+ STRING_LITERAL reduce using rule 14 (expression -> MINUS expression .)
+ RIGHT_BRACE reduce using rule 14 (expression -> MINUS expression .)
+ RIGHT_BRACKET reduce using rule 14 (expression -> MINUS expression .)
+ TIMES shift and go to state 49
+ DIVIDE shift and go to state 51
+
+ ! TIMES [ reduce using rule 14 (expression -> MINUS expression .) ]
+ ! DIVIDE [ reduce using rule 14 (expression -> MINUS expression .) ]
+ ! AND [ shift and go to state 52 ]
+ ! OR [ shift and go to state 50 ]
+ ! PLUS [ shift and go to state 44 ]
+ ! MINUS [ shift and go to state 48 ]
+ ! EQUALS [ shift and go to state 46 ]
+ ! NOT_EQUALS [ shift and go to state 45 ]
+ ! LESS_EQUALS [ shift and go to state 54 ]
+ ! LESS_THAN [ shift and go to state 47 ]
+ ! GREATER_EQUALS [ shift and go to state 55 ]
+ ! GREATER_THAN [ shift and go to state 53 ]
+
+
+state 41
+
+ (13) expression -> NOT expression .
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ AND reduce using rule 13 (expression -> NOT expression .)
+ OR reduce using rule 13 (expression -> NOT expression .)
+ PLUS reduce using rule 13 (expression -> NOT expression .)
+ MINUS reduce using rule 13 (expression -> NOT expression .)
+ TIMES reduce using rule 13 (expression -> NOT expression .)
+ DIVIDE reduce using rule 13 (expression -> NOT expression .)
+ EQUALS reduce using rule 13 (expression -> NOT expression .)
+ NOT_EQUALS reduce using rule 13 (expression -> NOT expression .)
+ LESS_EQUALS reduce using rule 13 (expression -> NOT expression .)
+ LESS_THAN reduce using rule 13 (expression -> NOT expression .)
+ GREATER_EQUALS reduce using rule 13 (expression -> NOT expression .)
+ GREATER_THAN reduce using rule 13 (expression -> NOT expression .)
+ IF reduce using rule 13 (expression -> NOT expression .)
+ STRING_LITERAL reduce using rule 13 (expression -> NOT expression .)
+ RIGHT_BRACE reduce using rule 13 (expression -> NOT expression .)
+ RIGHT_BRACKET reduce using rule 13 (expression -> NOT expression .)
+
+ ! AND [ shift and go to state 52 ]
+ ! OR [ shift and go to state 50 ]
+ ! PLUS [ shift and go to state 44 ]
+ ! MINUS [ shift and go to state 48 ]
+ ! TIMES [ shift and go to state 49 ]
+ ! DIVIDE [ shift and go to state 51 ]
+ ! EQUALS [ shift and go to state 46 ]
+ ! NOT_EQUALS [ shift and go to state 45 ]
+ ! LESS_EQUALS [ shift and go to state 54 ]
+ ! LESS_THAN [ shift and go to state 47 ]
+ ! GREATER_EQUALS [ shift and go to state 55 ]
+ ! GREATER_THAN [ shift and go to state 53 ]
+
+
+state 42
+
+ (11) expression -> LEFT_BRACKET expression . RIGHT_BRACKET
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ RIGHT_BRACKET shift and go to state 63
+ AND shift and go to state 52
+ OR shift and go to state 50
+ PLUS shift and go to state 44
+ MINUS shift and go to state 48
+ TIMES shift and go to state 49
+ DIVIDE shift and go to state 51
+ EQUALS shift and go to state 46
+ NOT_EQUALS shift and go to state 45
+ LESS_EQUALS shift and go to state 54
+ LESS_THAN shift and go to state 47
+ GREATER_EQUALS shift and go to state 55
+ GREATER_THAN shift and go to state 53
+
+
+state 43
+
+ (10) condition -> LEFT_BRACKET expression RIGHT_BRACKET .
+
+ LEFT_BRACE reduce using rule 10 (condition -> LEFT_BRACKET expression RIGHT_BRACKET .)
+
+
+state 44
+
+ (17) expression -> expression PLUS . expression
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 64
+
+state 45
+
+ (22) expression -> expression NOT_EQUALS . expression
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 65
+
+state 46
+
+ (21) expression -> expression EQUALS . expression
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 66
+
+state 47
+
+ (24) expression -> expression LESS_THAN . expression
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 67
+
+state 48
+
+ (18) expression -> expression MINUS . expression
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 68
+
+state 49
+
+ (19) expression -> expression TIMES . expression
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 69
+
+state 50
+
+ (16) expression -> expression OR . expression
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 70
+
+state 51
+
+ (20) expression -> expression DIVIDE . expression
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 71
+
+state 52
+
+ (15) expression -> expression AND . expression
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 72
+
+state 53
+
+ (26) expression -> expression GREATER_THAN . expression
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 73
+
+state 54
+
+ (23) expression -> expression LESS_EQUALS . expression
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 74
+
+state 55
+
+ (25) expression -> expression GREATER_EQUALS . expression
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ currency shift and go to state 22
+ expression shift and go to state 75
+
+state 56
+
+ (40) type -> DATE .
+
+ ASSIGN reduce using rule 40 (type -> DATE .)
+ IF reduce using rule 40 (type -> DATE .)
+ STRING_LITERAL reduce using rule 40 (type -> DATE .)
+ RIGHT_BRACE reduce using rule 40 (type -> DATE .)
+
+
+state 57
+
+ (38) type -> DECIMAL .
+
+ ASSIGN reduce using rule 38 (type -> DECIMAL .)
+ IF reduce using rule 38 (type -> DECIMAL .)
+ STRING_LITERAL reduce using rule 38 (type -> DECIMAL .)
+ RIGHT_BRACE reduce using rule 38 (type -> DECIMAL .)
+
+
+state 58
+
+ (39) type -> STRING .
+
+ ASSIGN reduce using rule 39 (type -> STRING .)
+ IF reduce using rule 39 (type -> STRING .)
+ STRING_LITERAL reduce using rule 39 (type -> STRING .)
+ RIGHT_BRACE reduce using rule 39 (type -> STRING .)
+
+
+state 59
+
+ (7) question -> STRING_LITERAL IDENTIFIER COLON type .
+ (8) question -> STRING_LITERAL IDENTIFIER COLON type . ASSIGN expression
+
+ IF reduce using rule 7 (question -> STRING_LITERAL IDENTIFIER COLON type .)
+ STRING_LITERAL reduce using rule 7 (question -> STRING_LITERAL IDENTIFIER COLON type .)
+ RIGHT_BRACE reduce using rule 7 (question -> STRING_LITERAL IDENTIFIER COLON type .)
+ ASSIGN shift and go to state 76
+
+
+state 60
+
+ (41) type -> MONEY .
+
+ ASSIGN reduce using rule 41 (type -> MONEY .)
+ IF reduce using rule 41 (type -> MONEY .)
+ STRING_LITERAL reduce using rule 41 (type -> MONEY .)
+ RIGHT_BRACE reduce using rule 41 (type -> MONEY .)
+
+
+state 61
+
+ (42) type -> INTEGER .
+
+ ASSIGN reduce using rule 42 (type -> INTEGER .)
+ IF reduce using rule 42 (type -> INTEGER .)
+ STRING_LITERAL reduce using rule 42 (type -> INTEGER .)
+ RIGHT_BRACE reduce using rule 42 (type -> INTEGER .)
+
+
+state 62
+
+ (37) type -> BOOLEAN .
+
+ ASSIGN reduce using rule 37 (type -> BOOLEAN .)
+ IF reduce using rule 37 (type -> BOOLEAN .)
+ STRING_LITERAL reduce using rule 37 (type -> BOOLEAN .)
+ RIGHT_BRACE reduce using rule 37 (type -> BOOLEAN .)
+
+
+state 63
+
+ (11) expression -> LEFT_BRACKET expression RIGHT_BRACKET .
+
+ AND reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+ OR reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+ PLUS reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+ MINUS reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+ TIMES reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+ DIVIDE reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+ EQUALS reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+ NOT_EQUALS reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+ LESS_EQUALS reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+ LESS_THAN reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+ GREATER_EQUALS reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+ GREATER_THAN reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+ IF reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+ STRING_LITERAL reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+ RIGHT_BRACE reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+ RIGHT_BRACKET reduce using rule 11 (expression -> LEFT_BRACKET expression RIGHT_BRACKET .)
+
+
+state 64
+
+ (17) expression -> expression PLUS expression .
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ AND reduce using rule 17 (expression -> expression PLUS expression .)
+ OR reduce using rule 17 (expression -> expression PLUS expression .)
+ PLUS reduce using rule 17 (expression -> expression PLUS expression .)
+ MINUS reduce using rule 17 (expression -> expression PLUS expression .)
+ EQUALS reduce using rule 17 (expression -> expression PLUS expression .)
+ NOT_EQUALS reduce using rule 17 (expression -> expression PLUS expression .)
+ LESS_EQUALS reduce using rule 17 (expression -> expression PLUS expression .)
+ LESS_THAN reduce using rule 17 (expression -> expression PLUS expression .)
+ GREATER_EQUALS reduce using rule 17 (expression -> expression PLUS expression .)
+ GREATER_THAN reduce using rule 17 (expression -> expression PLUS expression .)
+ IF reduce using rule 17 (expression -> expression PLUS expression .)
+ STRING_LITERAL reduce using rule 17 (expression -> expression PLUS expression .)
+ RIGHT_BRACE reduce using rule 17 (expression -> expression PLUS expression .)
+ RIGHT_BRACKET reduce using rule 17 (expression -> expression PLUS expression .)
+ TIMES shift and go to state 49
+ DIVIDE shift and go to state 51
+
+ ! TIMES [ reduce using rule 17 (expression -> expression PLUS expression .) ]
+ ! DIVIDE [ reduce using rule 17 (expression -> expression PLUS expression .) ]
+ ! AND [ shift and go to state 52 ]
+ ! OR [ shift and go to state 50 ]
+ ! PLUS [ shift and go to state 44 ]
+ ! MINUS [ shift and go to state 48 ]
+ ! EQUALS [ shift and go to state 46 ]
+ ! NOT_EQUALS [ shift and go to state 45 ]
+ ! LESS_EQUALS [ shift and go to state 54 ]
+ ! LESS_THAN [ shift and go to state 47 ]
+ ! GREATER_EQUALS [ shift and go to state 55 ]
+ ! GREATER_THAN [ shift and go to state 53 ]
+
+
+state 65
+
+ (22) expression -> expression NOT_EQUALS expression .
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ AND reduce using rule 22 (expression -> expression NOT_EQUALS expression .)
+ OR reduce using rule 22 (expression -> expression NOT_EQUALS expression .)
+ EQUALS reduce using rule 22 (expression -> expression NOT_EQUALS expression .)
+ NOT_EQUALS reduce using rule 22 (expression -> expression NOT_EQUALS expression .)
+ IF reduce using rule 22 (expression -> expression NOT_EQUALS expression .)
+ STRING_LITERAL reduce using rule 22 (expression -> expression NOT_EQUALS expression .)
+ RIGHT_BRACE reduce using rule 22 (expression -> expression NOT_EQUALS expression .)
+ RIGHT_BRACKET reduce using rule 22 (expression -> expression NOT_EQUALS expression .)
+ PLUS shift and go to state 44
+ MINUS shift and go to state 48
+ TIMES shift and go to state 49
+ DIVIDE shift and go to state 51
+ LESS_EQUALS shift and go to state 54
+ LESS_THAN shift and go to state 47
+ GREATER_EQUALS shift and go to state 55
+ GREATER_THAN shift and go to state 53
+
+ ! PLUS [ reduce using rule 22 (expression -> expression NOT_EQUALS expression .) ]
+ ! MINUS [ reduce using rule 22 (expression -> expression NOT_EQUALS expression .) ]
+ ! TIMES [ reduce using rule 22 (expression -> expression NOT_EQUALS expression .) ]
+ ! DIVIDE [ reduce using rule 22 (expression -> expression NOT_EQUALS expression .) ]
+ ! LESS_EQUALS [ reduce using rule 22 (expression -> expression NOT_EQUALS expression .) ]
+ ! LESS_THAN [ reduce using rule 22 (expression -> expression NOT_EQUALS expression .) ]
+ ! GREATER_EQUALS [ reduce using rule 22 (expression -> expression NOT_EQUALS expression .) ]
+ ! GREATER_THAN [ reduce using rule 22 (expression -> expression NOT_EQUALS expression .) ]
+ ! AND [ shift and go to state 52 ]
+ ! OR [ shift and go to state 50 ]
+ ! EQUALS [ shift and go to state 46 ]
+ ! NOT_EQUALS [ shift and go to state 45 ]
+
+
+state 66
+
+ (21) expression -> expression EQUALS expression .
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ AND reduce using rule 21 (expression -> expression EQUALS expression .)
+ OR reduce using rule 21 (expression -> expression EQUALS expression .)
+ EQUALS reduce using rule 21 (expression -> expression EQUALS expression .)
+ NOT_EQUALS reduce using rule 21 (expression -> expression EQUALS expression .)
+ IF reduce using rule 21 (expression -> expression EQUALS expression .)
+ STRING_LITERAL reduce using rule 21 (expression -> expression EQUALS expression .)
+ RIGHT_BRACE reduce using rule 21 (expression -> expression EQUALS expression .)
+ RIGHT_BRACKET reduce using rule 21 (expression -> expression EQUALS expression .)
+ PLUS shift and go to state 44
+ MINUS shift and go to state 48
+ TIMES shift and go to state 49
+ DIVIDE shift and go to state 51
+ LESS_EQUALS shift and go to state 54
+ LESS_THAN shift and go to state 47
+ GREATER_EQUALS shift and go to state 55
+ GREATER_THAN shift and go to state 53
+
+ ! PLUS [ reduce using rule 21 (expression -> expression EQUALS expression .) ]
+ ! MINUS [ reduce using rule 21 (expression -> expression EQUALS expression .) ]
+ ! TIMES [ reduce using rule 21 (expression -> expression EQUALS expression .) ]
+ ! DIVIDE [ reduce using rule 21 (expression -> expression EQUALS expression .) ]
+ ! LESS_EQUALS [ reduce using rule 21 (expression -> expression EQUALS expression .) ]
+ ! LESS_THAN [ reduce using rule 21 (expression -> expression EQUALS expression .) ]
+ ! GREATER_EQUALS [ reduce using rule 21 (expression -> expression EQUALS expression .) ]
+ ! GREATER_THAN [ reduce using rule 21 (expression -> expression EQUALS expression .) ]
+ ! AND [ shift and go to state 52 ]
+ ! OR [ shift and go to state 50 ]
+ ! EQUALS [ shift and go to state 46 ]
+ ! NOT_EQUALS [ shift and go to state 45 ]
+
+
+state 67
+
+ (24) expression -> expression LESS_THAN expression .
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ AND reduce using rule 24 (expression -> expression LESS_THAN expression .)
+ OR reduce using rule 24 (expression -> expression LESS_THAN expression .)
+ EQUALS reduce using rule 24 (expression -> expression LESS_THAN expression .)
+ NOT_EQUALS reduce using rule 24 (expression -> expression LESS_THAN expression .)
+ LESS_EQUALS reduce using rule 24 (expression -> expression LESS_THAN expression .)
+ LESS_THAN reduce using rule 24 (expression -> expression LESS_THAN expression .)
+ GREATER_EQUALS reduce using rule 24 (expression -> expression LESS_THAN expression .)
+ GREATER_THAN reduce using rule 24 (expression -> expression LESS_THAN expression .)
+ IF reduce using rule 24 (expression -> expression LESS_THAN expression .)
+ STRING_LITERAL reduce using rule 24 (expression -> expression LESS_THAN expression .)
+ RIGHT_BRACE reduce using rule 24 (expression -> expression LESS_THAN expression .)
+ RIGHT_BRACKET reduce using rule 24 (expression -> expression LESS_THAN expression .)
+ PLUS shift and go to state 44
+ MINUS shift and go to state 48
+ TIMES shift and go to state 49
+ DIVIDE shift and go to state 51
+
+ ! PLUS [ reduce using rule 24 (expression -> expression LESS_THAN expression .) ]
+ ! MINUS [ reduce using rule 24 (expression -> expression LESS_THAN expression .) ]
+ ! TIMES [ reduce using rule 24 (expression -> expression LESS_THAN expression .) ]
+ ! DIVIDE [ reduce using rule 24 (expression -> expression LESS_THAN expression .) ]
+ ! AND [ shift and go to state 52 ]
+ ! OR [ shift and go to state 50 ]
+ ! EQUALS [ shift and go to state 46 ]
+ ! NOT_EQUALS [ shift and go to state 45 ]
+ ! LESS_EQUALS [ shift and go to state 54 ]
+ ! LESS_THAN [ shift and go to state 47 ]
+ ! GREATER_EQUALS [ shift and go to state 55 ]
+ ! GREATER_THAN [ shift and go to state 53 ]
+
+
+state 68
+
+ (18) expression -> expression MINUS expression .
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ AND reduce using rule 18 (expression -> expression MINUS expression .)
+ OR reduce using rule 18 (expression -> expression MINUS expression .)
+ PLUS reduce using rule 18 (expression -> expression MINUS expression .)
+ MINUS reduce using rule 18 (expression -> expression MINUS expression .)
+ EQUALS reduce using rule 18 (expression -> expression MINUS expression .)
+ NOT_EQUALS reduce using rule 18 (expression -> expression MINUS expression .)
+ LESS_EQUALS reduce using rule 18 (expression -> expression MINUS expression .)
+ LESS_THAN reduce using rule 18 (expression -> expression MINUS expression .)
+ GREATER_EQUALS reduce using rule 18 (expression -> expression MINUS expression .)
+ GREATER_THAN reduce using rule 18 (expression -> expression MINUS expression .)
+ IF reduce using rule 18 (expression -> expression MINUS expression .)
+ STRING_LITERAL reduce using rule 18 (expression -> expression MINUS expression .)
+ RIGHT_BRACE reduce using rule 18 (expression -> expression MINUS expression .)
+ RIGHT_BRACKET reduce using rule 18 (expression -> expression MINUS expression .)
+ TIMES shift and go to state 49
+ DIVIDE shift and go to state 51
+
+ ! TIMES [ reduce using rule 18 (expression -> expression MINUS expression .) ]
+ ! DIVIDE [ reduce using rule 18 (expression -> expression MINUS expression .) ]
+ ! AND [ shift and go to state 52 ]
+ ! OR [ shift and go to state 50 ]
+ ! PLUS [ shift and go to state 44 ]
+ ! MINUS [ shift and go to state 48 ]
+ ! EQUALS [ shift and go to state 46 ]
+ ! NOT_EQUALS [ shift and go to state 45 ]
+ ! LESS_EQUALS [ shift and go to state 54 ]
+ ! LESS_THAN [ shift and go to state 47 ]
+ ! GREATER_EQUALS [ shift and go to state 55 ]
+ ! GREATER_THAN [ shift and go to state 53 ]
+
+
+state 69
+
+ (19) expression -> expression TIMES expression .
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ AND reduce using rule 19 (expression -> expression TIMES expression .)
+ OR reduce using rule 19 (expression -> expression TIMES expression .)
+ PLUS reduce using rule 19 (expression -> expression TIMES expression .)
+ MINUS reduce using rule 19 (expression -> expression TIMES expression .)
+ TIMES reduce using rule 19 (expression -> expression TIMES expression .)
+ DIVIDE reduce using rule 19 (expression -> expression TIMES expression .)
+ EQUALS reduce using rule 19 (expression -> expression TIMES expression .)
+ NOT_EQUALS reduce using rule 19 (expression -> expression TIMES expression .)
+ LESS_EQUALS reduce using rule 19 (expression -> expression TIMES expression .)
+ LESS_THAN reduce using rule 19 (expression -> expression TIMES expression .)
+ GREATER_EQUALS reduce using rule 19 (expression -> expression TIMES expression .)
+ GREATER_THAN reduce using rule 19 (expression -> expression TIMES expression .)
+ IF reduce using rule 19 (expression -> expression TIMES expression .)
+ STRING_LITERAL reduce using rule 19 (expression -> expression TIMES expression .)
+ RIGHT_BRACE reduce using rule 19 (expression -> expression TIMES expression .)
+ RIGHT_BRACKET reduce using rule 19 (expression -> expression TIMES expression .)
+
+ ! AND [ shift and go to state 52 ]
+ ! OR [ shift and go to state 50 ]
+ ! PLUS [ shift and go to state 44 ]
+ ! MINUS [ shift and go to state 48 ]
+ ! TIMES [ shift and go to state 49 ]
+ ! DIVIDE [ shift and go to state 51 ]
+ ! EQUALS [ shift and go to state 46 ]
+ ! NOT_EQUALS [ shift and go to state 45 ]
+ ! LESS_EQUALS [ shift and go to state 54 ]
+ ! LESS_THAN [ shift and go to state 47 ]
+ ! GREATER_EQUALS [ shift and go to state 55 ]
+ ! GREATER_THAN [ shift and go to state 53 ]
+
+
+state 70
+
+ (16) expression -> expression OR expression .
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ OR reduce using rule 16 (expression -> expression OR expression .)
+ IF reduce using rule 16 (expression -> expression OR expression .)
+ STRING_LITERAL reduce using rule 16 (expression -> expression OR expression .)
+ RIGHT_BRACE reduce using rule 16 (expression -> expression OR expression .)
+ RIGHT_BRACKET reduce using rule 16 (expression -> expression OR expression .)
+ AND shift and go to state 52
+ PLUS shift and go to state 44
+ MINUS shift and go to state 48
+ TIMES shift and go to state 49
+ DIVIDE shift and go to state 51
+ EQUALS shift and go to state 46
+ NOT_EQUALS shift and go to state 45
+ LESS_EQUALS shift and go to state 54
+ LESS_THAN shift and go to state 47
+ GREATER_EQUALS shift and go to state 55
+ GREATER_THAN shift and go to state 53
+
+ ! AND [ reduce using rule 16 (expression -> expression OR expression .) ]
+ ! PLUS [ reduce using rule 16 (expression -> expression OR expression .) ]
+ ! MINUS [ reduce using rule 16 (expression -> expression OR expression .) ]
+ ! TIMES [ reduce using rule 16 (expression -> expression OR expression .) ]
+ ! DIVIDE [ reduce using rule 16 (expression -> expression OR expression .) ]
+ ! EQUALS [ reduce using rule 16 (expression -> expression OR expression .) ]
+ ! NOT_EQUALS [ reduce using rule 16 (expression -> expression OR expression .) ]
+ ! LESS_EQUALS [ reduce using rule 16 (expression -> expression OR expression .) ]
+ ! LESS_THAN [ reduce using rule 16 (expression -> expression OR expression .) ]
+ ! GREATER_EQUALS [ reduce using rule 16 (expression -> expression OR expression .) ]
+ ! GREATER_THAN [ reduce using rule 16 (expression -> expression OR expression .) ]
+ ! OR [ shift and go to state 50 ]
+
+
+state 71
+
+ (20) expression -> expression DIVIDE expression .
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ AND reduce using rule 20 (expression -> expression DIVIDE expression .)
+ OR reduce using rule 20 (expression -> expression DIVIDE expression .)
+ PLUS reduce using rule 20 (expression -> expression DIVIDE expression .)
+ MINUS reduce using rule 20 (expression -> expression DIVIDE expression .)
+ TIMES reduce using rule 20 (expression -> expression DIVIDE expression .)
+ DIVIDE reduce using rule 20 (expression -> expression DIVIDE expression .)
+ EQUALS reduce using rule 20 (expression -> expression DIVIDE expression .)
+ NOT_EQUALS reduce using rule 20 (expression -> expression DIVIDE expression .)
+ LESS_EQUALS reduce using rule 20 (expression -> expression DIVIDE expression .)
+ LESS_THAN reduce using rule 20 (expression -> expression DIVIDE expression .)
+ GREATER_EQUALS reduce using rule 20 (expression -> expression DIVIDE expression .)
+ GREATER_THAN reduce using rule 20 (expression -> expression DIVIDE expression .)
+ IF reduce using rule 20 (expression -> expression DIVIDE expression .)
+ STRING_LITERAL reduce using rule 20 (expression -> expression DIVIDE expression .)
+ RIGHT_BRACE reduce using rule 20 (expression -> expression DIVIDE expression .)
+ RIGHT_BRACKET reduce using rule 20 (expression -> expression DIVIDE expression .)
+
+ ! AND [ shift and go to state 52 ]
+ ! OR [ shift and go to state 50 ]
+ ! PLUS [ shift and go to state 44 ]
+ ! MINUS [ shift and go to state 48 ]
+ ! TIMES [ shift and go to state 49 ]
+ ! DIVIDE [ shift and go to state 51 ]
+ ! EQUALS [ shift and go to state 46 ]
+ ! NOT_EQUALS [ shift and go to state 45 ]
+ ! LESS_EQUALS [ shift and go to state 54 ]
+ ! LESS_THAN [ shift and go to state 47 ]
+ ! GREATER_EQUALS [ shift and go to state 55 ]
+ ! GREATER_THAN [ shift and go to state 53 ]
+
+
+state 72
+
+ (15) expression -> expression AND expression .
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ AND reduce using rule 15 (expression -> expression AND expression .)
+ OR reduce using rule 15 (expression -> expression AND expression .)
+ IF reduce using rule 15 (expression -> expression AND expression .)
+ STRING_LITERAL reduce using rule 15 (expression -> expression AND expression .)
+ RIGHT_BRACE reduce using rule 15 (expression -> expression AND expression .)
+ RIGHT_BRACKET reduce using rule 15 (expression -> expression AND expression .)
+ PLUS shift and go to state 44
+ MINUS shift and go to state 48
+ TIMES shift and go to state 49
+ DIVIDE shift and go to state 51
+ EQUALS shift and go to state 46
+ NOT_EQUALS shift and go to state 45
+ LESS_EQUALS shift and go to state 54
+ LESS_THAN shift and go to state 47
+ GREATER_EQUALS shift and go to state 55
+ GREATER_THAN shift and go to state 53
+
+ ! PLUS [ reduce using rule 15 (expression -> expression AND expression .) ]
+ ! MINUS [ reduce using rule 15 (expression -> expression AND expression .) ]
+ ! TIMES [ reduce using rule 15 (expression -> expression AND expression .) ]
+ ! DIVIDE [ reduce using rule 15 (expression -> expression AND expression .) ]
+ ! EQUALS [ reduce using rule 15 (expression -> expression AND expression .) ]
+ ! NOT_EQUALS [ reduce using rule 15 (expression -> expression AND expression .) ]
+ ! LESS_EQUALS [ reduce using rule 15 (expression -> expression AND expression .) ]
+ ! LESS_THAN [ reduce using rule 15 (expression -> expression AND expression .) ]
+ ! GREATER_EQUALS [ reduce using rule 15 (expression -> expression AND expression .) ]
+ ! GREATER_THAN [ reduce using rule 15 (expression -> expression AND expression .) ]
+ ! AND [ shift and go to state 52 ]
+ ! OR [ shift and go to state 50 ]
+
+
+state 73
+
+ (26) expression -> expression GREATER_THAN expression .
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ AND reduce using rule 26 (expression -> expression GREATER_THAN expression .)
+ OR reduce using rule 26 (expression -> expression GREATER_THAN expression .)
+ EQUALS reduce using rule 26 (expression -> expression GREATER_THAN expression .)
+ NOT_EQUALS reduce using rule 26 (expression -> expression GREATER_THAN expression .)
+ LESS_EQUALS reduce using rule 26 (expression -> expression GREATER_THAN expression .)
+ LESS_THAN reduce using rule 26 (expression -> expression GREATER_THAN expression .)
+ GREATER_EQUALS reduce using rule 26 (expression -> expression GREATER_THAN expression .)
+ GREATER_THAN reduce using rule 26 (expression -> expression GREATER_THAN expression .)
+ IF reduce using rule 26 (expression -> expression GREATER_THAN expression .)
+ STRING_LITERAL reduce using rule 26 (expression -> expression GREATER_THAN expression .)
+ RIGHT_BRACE reduce using rule 26 (expression -> expression GREATER_THAN expression .)
+ RIGHT_BRACKET reduce using rule 26 (expression -> expression GREATER_THAN expression .)
+ PLUS shift and go to state 44
+ MINUS shift and go to state 48
+ TIMES shift and go to state 49
+ DIVIDE shift and go to state 51
+
+ ! PLUS [ reduce using rule 26 (expression -> expression GREATER_THAN expression .) ]
+ ! MINUS [ reduce using rule 26 (expression -> expression GREATER_THAN expression .) ]
+ ! TIMES [ reduce using rule 26 (expression -> expression GREATER_THAN expression .) ]
+ ! DIVIDE [ reduce using rule 26 (expression -> expression GREATER_THAN expression .) ]
+ ! AND [ shift and go to state 52 ]
+ ! OR [ shift and go to state 50 ]
+ ! EQUALS [ shift and go to state 46 ]
+ ! NOT_EQUALS [ shift and go to state 45 ]
+ ! LESS_EQUALS [ shift and go to state 54 ]
+ ! LESS_THAN [ shift and go to state 47 ]
+ ! GREATER_EQUALS [ shift and go to state 55 ]
+ ! GREATER_THAN [ shift and go to state 53 ]
+
+
+state 74
+
+ (23) expression -> expression LESS_EQUALS expression .
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ AND reduce using rule 23 (expression -> expression LESS_EQUALS expression .)
+ OR reduce using rule 23 (expression -> expression LESS_EQUALS expression .)
+ EQUALS reduce using rule 23 (expression -> expression LESS_EQUALS expression .)
+ NOT_EQUALS reduce using rule 23 (expression -> expression LESS_EQUALS expression .)
+ LESS_EQUALS reduce using rule 23 (expression -> expression LESS_EQUALS expression .)
+ LESS_THAN reduce using rule 23 (expression -> expression LESS_EQUALS expression .)
+ GREATER_EQUALS reduce using rule 23 (expression -> expression LESS_EQUALS expression .)
+ GREATER_THAN reduce using rule 23 (expression -> expression LESS_EQUALS expression .)
+ IF reduce using rule 23 (expression -> expression LESS_EQUALS expression .)
+ STRING_LITERAL reduce using rule 23 (expression -> expression LESS_EQUALS expression .)
+ RIGHT_BRACE reduce using rule 23 (expression -> expression LESS_EQUALS expression .)
+ RIGHT_BRACKET reduce using rule 23 (expression -> expression LESS_EQUALS expression .)
+ PLUS shift and go to state 44
+ MINUS shift and go to state 48
+ TIMES shift and go to state 49
+ DIVIDE shift and go to state 51
+
+ ! PLUS [ reduce using rule 23 (expression -> expression LESS_EQUALS expression .) ]
+ ! MINUS [ reduce using rule 23 (expression -> expression LESS_EQUALS expression .) ]
+ ! TIMES [ reduce using rule 23 (expression -> expression LESS_EQUALS expression .) ]
+ ! DIVIDE [ reduce using rule 23 (expression -> expression LESS_EQUALS expression .) ]
+ ! AND [ shift and go to state 52 ]
+ ! OR [ shift and go to state 50 ]
+ ! EQUALS [ shift and go to state 46 ]
+ ! NOT_EQUALS [ shift and go to state 45 ]
+ ! LESS_EQUALS [ shift and go to state 54 ]
+ ! LESS_THAN [ shift and go to state 47 ]
+ ! GREATER_EQUALS [ shift and go to state 55 ]
+ ! GREATER_THAN [ shift and go to state 53 ]
+
+
+state 75
+
+ (25) expression -> expression GREATER_EQUALS expression .
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ AND reduce using rule 25 (expression -> expression GREATER_EQUALS expression .)
+ OR reduce using rule 25 (expression -> expression GREATER_EQUALS expression .)
+ EQUALS reduce using rule 25 (expression -> expression GREATER_EQUALS expression .)
+ NOT_EQUALS reduce using rule 25 (expression -> expression GREATER_EQUALS expression .)
+ LESS_EQUALS reduce using rule 25 (expression -> expression GREATER_EQUALS expression .)
+ LESS_THAN reduce using rule 25 (expression -> expression GREATER_EQUALS expression .)
+ GREATER_EQUALS reduce using rule 25 (expression -> expression GREATER_EQUALS expression .)
+ GREATER_THAN reduce using rule 25 (expression -> expression GREATER_EQUALS expression .)
+ IF reduce using rule 25 (expression -> expression GREATER_EQUALS expression .)
+ STRING_LITERAL reduce using rule 25 (expression -> expression GREATER_EQUALS expression .)
+ RIGHT_BRACE reduce using rule 25 (expression -> expression GREATER_EQUALS expression .)
+ RIGHT_BRACKET reduce using rule 25 (expression -> expression GREATER_EQUALS expression .)
+ PLUS shift and go to state 44
+ MINUS shift and go to state 48
+ TIMES shift and go to state 49
+ DIVIDE shift and go to state 51
+
+ ! PLUS [ reduce using rule 25 (expression -> expression GREATER_EQUALS expression .) ]
+ ! MINUS [ reduce using rule 25 (expression -> expression GREATER_EQUALS expression .) ]
+ ! TIMES [ reduce using rule 25 (expression -> expression GREATER_EQUALS expression .) ]
+ ! DIVIDE [ reduce using rule 25 (expression -> expression GREATER_EQUALS expression .) ]
+ ! AND [ shift and go to state 52 ]
+ ! OR [ shift and go to state 50 ]
+ ! EQUALS [ shift and go to state 46 ]
+ ! NOT_EQUALS [ shift and go to state 45 ]
+ ! LESS_EQUALS [ shift and go to state 54 ]
+ ! LESS_THAN [ shift and go to state 47 ]
+ ! GREATER_EQUALS [ shift and go to state 55 ]
+ ! GREATER_THAN [ shift and go to state 53 ]
+
+
+state 76
+
+ (8) question -> STRING_LITERAL IDENTIFIER COLON type ASSIGN . expression
+ (11) expression -> . LEFT_BRACKET expression RIGHT_BRACKET
+ (12) expression -> . IDENTIFIER
+ (13) expression -> . NOT expression
+ (14) expression -> . MINUS expression
+ (15) expression -> . expression AND expression
+ (16) expression -> . expression OR expression
+ (17) expression -> . expression PLUS expression
+ (18) expression -> . expression MINUS expression
+ (19) expression -> . expression TIMES expression
+ (20) expression -> . expression DIVIDE expression
+ (21) expression -> . expression EQUALS expression
+ (22) expression -> . expression NOT_EQUALS expression
+ (23) expression -> . expression LESS_EQUALS expression
+ (24) expression -> . expression LESS_THAN expression
+ (25) expression -> . expression GREATER_EQUALS expression
+ (26) expression -> . expression GREATER_THAN expression
+ (27) expression -> . FALSE
+ (28) expression -> . TRUE
+ (29) expression -> . DATE_LITERAL
+ (30) expression -> . INTEGER_LITERAL
+ (31) expression -> . DECIMAL_LITERAL
+ (32) expression -> . currency DECIMAL_LITERAL
+ (33) expression -> . currency INTEGER_LITERAL
+ (34) expression -> . STRING_LITERAL
+ (35) currency -> . DOLLAR
+ (36) currency -> . RUBLE
+
+ LEFT_BRACKET shift and go to state 30
+ IDENTIFIER shift and go to state 34
+ NOT shift and go to state 27
+ MINUS shift and go to state 25
+ FALSE shift and go to state 35
+ TRUE shift and go to state 32
+ DATE_LITERAL shift and go to state 24
+ INTEGER_LITERAL shift and go to state 26
+ DECIMAL_LITERAL shift and go to state 31
+ STRING_LITERAL shift and go to state 28
+ DOLLAR shift and go to state 29
+ RUBLE shift and go to state 23
+
+ expression shift and go to state 77
+ currency shift and go to state 22
+
+state 77
+
+ (8) question -> STRING_LITERAL IDENTIFIER COLON type ASSIGN expression .
+ (15) expression -> expression . AND expression
+ (16) expression -> expression . OR expression
+ (17) expression -> expression . PLUS expression
+ (18) expression -> expression . MINUS expression
+ (19) expression -> expression . TIMES expression
+ (20) expression -> expression . DIVIDE expression
+ (21) expression -> expression . EQUALS expression
+ (22) expression -> expression . NOT_EQUALS expression
+ (23) expression -> expression . LESS_EQUALS expression
+ (24) expression -> expression . LESS_THAN expression
+ (25) expression -> expression . GREATER_EQUALS expression
+ (26) expression -> expression . GREATER_THAN expression
+
+ IF reduce using rule 8 (question -> STRING_LITERAL IDENTIFIER COLON type ASSIGN expression .)
+ STRING_LITERAL reduce using rule 8 (question -> STRING_LITERAL IDENTIFIER COLON type ASSIGN expression .)
+ RIGHT_BRACE reduce using rule 8 (question -> STRING_LITERAL IDENTIFIER COLON type ASSIGN expression .)
+ AND shift and go to state 52
+ OR shift and go to state 50
+ PLUS shift and go to state 44
+ MINUS shift and go to state 48
+ TIMES shift and go to state 49
+ DIVIDE shift and go to state 51
+ EQUALS shift and go to state 46
+ NOT_EQUALS shift and go to state 45
+ LESS_EQUALS shift and go to state 54
+ LESS_THAN shift and go to state 47
+ GREATER_EQUALS shift and go to state 55
+ GREATER_THAN shift and go to state 53
+
diff --git a/ql/parser/parser.py b/ql/parser/parser.py
new file mode 100644
index 0000000..d962a0f
--- /dev/null
+++ b/ql/parser/parser.py
@@ -0,0 +1,319 @@
+from ply.yacc import yacc
+
+from ql.ast.nodes.expressions.binary_operators.addition_operator import AdditionOperatorNode
+from ql.ast.nodes.expressions.binary_operators.and_operator import AndOperatorNode
+from ql.ast.nodes.expressions.binary_operators.division_operator import DivisionOperatorNode
+from ql.ast.nodes.expressions.binary_operators.equals_operator import EqualsOperatorNode
+from ql.ast.nodes.expressions.binary_operators.greater_equals_operator import GreaterEqualsOperatorNode
+from ql.ast.nodes.expressions.binary_operators.greater_than_operator import GreaterThanOperatorNode
+from ql.ast.nodes.expressions.binary_operators.less_equals_operator import LessEqualsOperatorNode
+from ql.ast.nodes.expressions.binary_operators.less_than_operator import LessThanOperatorNode
+from ql.ast.nodes.expressions.binary_operators.multiplication_operator import MultiplicationOperatorNode
+from ql.ast.nodes.expressions.binary_operators.not_equals_operator import NotEqualsOperatorNode
+from ql.ast.nodes.expressions.binary_operators.or_operator import OrOperatorNode
+from ql.ast.nodes.expressions.binary_operators.subtraction_operator import SubtractionOperatorNode
+from ql.ast.nodes.expressions.literals.boolean_literal import BooleanNode
+from ql.ast.nodes.expressions.literals.date_literal import DateNode
+from ql.ast.nodes.expressions.literals.decimal_literal import DecimalNode
+from ql.ast.nodes.expressions.literals.integer_literal import IntegerNode
+from ql.ast.nodes.expressions.literals.money_literal import MoneyNode
+from ql.ast.nodes.expressions.literals.string_literal import StringNode
+from ql.ast.nodes.expressions.unary_operators.negation_operator import NegationOperatorNode
+from ql.ast.nodes.expressions.unary_operators.negative_operator import NegativeOperatorNode
+from ql.ast.nodes.expressions.variable import VariableNode
+from ql.ast.nodes.statements.form_statement import FormNode
+from ql.ast.nodes.statements.if_statement import IfNode
+from ql.ast.nodes.statements.question_statement import QuestionNode
+from ql.parser.lexer import QLLexer
+from ql.parser.metadata import Metadata
+from ql.types.boolean import QLBoolean
+from ql.types.date import QLDate
+from ql.types.decimal import QLDecimal
+from ql.types.integer import QLInteger
+from ql.types.money import QLMoney
+from ql.types.string import QLString
+from ql.types.undefined import QLUndefined
+
+
+class QLParser:
+ def __init__(self):
+ self.__errors = []
+ self.__tokens = QLLexer.tokens
+ self.__parser = None
+ self.__precedence = (
+ ('left', 'OR'),
+ ('left', 'AND'),
+ ('nonassoc', 'EQUALS', 'NOT_EQUALS'),
+ ('nonassoc', 'LESS_EQUALS', 'LESS_THAN', 'GREATER_EQUALS', 'GREATER_THAN'),
+ ('left', 'PLUS', 'MINUS'),
+ ('left', 'TIMES', 'DIVIDE'),
+ ('right', 'NOT'),
+ )
+
+ @property
+ def errors(self):
+ return self.__errors
+
+ @property
+ def tokens(self):
+ return self.__tokens
+
+ @property
+ def parser(self):
+ return self.__parser
+
+ @property
+ def precedence(self):
+ return self.__precedence
+
+ def build(self):
+ self.__parser = yacc(module=self)
+
+ def parse(self, data, lexer):
+ self.__errors = []
+ return self.parser.parse(data, lexer)
+
+ # Grammar
+ @staticmethod
+ def p_form(production):
+ """form : FORM IDENTIFIER block"""
+ production[0] = FormNode(Metadata(production.lineno(1)), production[3], production[2])
+
+ @staticmethod
+ def p_block(production):
+ """block : LEFT_BRACE statements RIGHT_BRACE"""
+ production[0] = production[2]
+
+ # Statements
+ @staticmethod
+ def p_statements(production):
+ """statements : statement statements
+ | statement"""
+ if len(production) == 3:
+ production[0] = [production[1]] + production[2]
+ elif len(production) == 2:
+ production[0] = [production[1]]
+
+ @staticmethod
+ def p_statement(production):
+ """statement : if
+ | question"""
+ production[0] = production[1]
+
+ # Questions
+ @staticmethod
+ def p_question(production):
+ """question : STRING_LITERAL IDENTIFIER COLON type"""
+ production[0] = QuestionNode(Metadata(production.lineno(1)), production[1], production[2],
+ production[4], production[4].get_literal_node(production[4]()), False)
+
+ @staticmethod
+ def p_question_computed(production):
+ """question : STRING_LITERAL IDENTIFIER COLON type ASSIGN expression"""
+ production[0] = QuestionNode(Metadata(production.lineno(1)), production[1], production[2],
+ production[4], production[6], True)
+
+ # Control flow
+ @staticmethod
+ def p_if(production):
+ """if : IF condition block"""
+ production[0] = IfNode(Metadata(production.lineno(1)), production[3], production[2])
+
+ @staticmethod
+ def p_condition(production):
+ """condition : LEFT_BRACKET expression RIGHT_BRACKET"""
+ production[0] = production[2]
+
+ # Expressions
+ @staticmethod
+ def p_parenthesis(production):
+ """expression : LEFT_BRACKET expression RIGHT_BRACKET"""
+ production[0] = production[2]
+
+ @staticmethod
+ def p_variable(production):
+ """expression : IDENTIFIER"""
+ production[0] = VariableNode(Metadata(production.lineno(1)), QLUndefined, production[1],
+ QLUndefined())
+
+ # Unary operators
+ @staticmethod
+ def p_not(production):
+ """expression : NOT expression"""
+ production[0] = NegationOperatorNode(Metadata(production.lineno(1)), QLBoolean,
+ production[2], QLUndefined())
+
+ @staticmethod
+ def p_negative(production):
+ """expression : MINUS expression"""
+ production[0] = NegativeOperatorNode(Metadata(production.lineno(1)), QLUndefined,
+ production[2], QLUndefined())
+
+ # Binary operators
+ @staticmethod
+ def p_and(production):
+ """expression : expression AND expression"""
+ production[0] = AndOperatorNode(Metadata(production.lineno(2)), QLBoolean, production[1],
+ production[3], QLUndefined())
+
+ @staticmethod
+ def p_or(production):
+ """expression : expression OR expression"""
+ production[0] = OrOperatorNode(Metadata(production.lineno(2)), QLBoolean, production[1],
+ production[3], QLUndefined())
+
+ @staticmethod
+ def p_plus(production):
+ """expression : expression PLUS expression"""
+ production[0] = AdditionOperatorNode(Metadata(production.lineno(2)), QLUndefined,
+ production[1], production[3], QLUndefined())
+
+ @staticmethod
+ def p_minus(production):
+ """expression : expression MINUS expression"""
+ production[0] = SubtractionOperatorNode(Metadata(production.lineno(2)), QLUndefined,
+ production[1], production[3], QLUndefined())
+
+ @staticmethod
+ def p_times(production):
+ """expression : expression TIMES expression"""
+ production[0] = MultiplicationOperatorNode(Metadata(production.lineno(2)), QLUndefined,
+ production[1], production[3], QLUndefined())
+
+ @staticmethod
+ def p_divide(production):
+ """expression : expression DIVIDE expression"""
+ production[0] = DivisionOperatorNode(Metadata(production.lineno(2)), QLUndefined,
+ production[1], production[3], QLUndefined())
+
+ @staticmethod
+ def p_equals(production):
+ """expression : expression EQUALS expression"""
+ production[0] = EqualsOperatorNode(Metadata(production.lineno(2)), QLBoolean,
+ production[1], production[3], QLUndefined())
+
+ @staticmethod
+ def p_not_equals(production):
+ """expression : expression NOT_EQUALS expression"""
+ production[0] = NotEqualsOperatorNode(Metadata(production.lineno(2)), QLBoolean,
+ production[1], production[3], QLUndefined())
+
+ @staticmethod
+ def p_less_equals(production):
+ """expression : expression LESS_EQUALS expression"""
+ production[0] = LessEqualsOperatorNode(Metadata(production.lineno(2)), QLBoolean,
+ production[1], production[3], QLUndefined())
+
+ @staticmethod
+ def p_less_than(production):
+ """expression : expression LESS_THAN expression"""
+ production[0] = LessThanOperatorNode(Metadata(production.lineno(2)), QLBoolean,
+ production[1], production[3], QLUndefined())
+
+ @staticmethod
+ def p_greater_equals(production):
+ """expression : expression GREATER_EQUALS expression"""
+ production[0] = GreaterEqualsOperatorNode(Metadata(production.lineno(2)), QLBoolean,
+ production[1], production[3], QLUndefined())
+
+ @staticmethod
+ def p_greater_than(production):
+ """expression : expression GREATER_THAN expression"""
+ production[0] = GreaterThanOperatorNode(Metadata(production.lineno(2)), QLBoolean,
+ production[1], production[3], QLUndefined())
+
+ # Literals
+ @staticmethod
+ def p_boolean_literal(production):
+ """expression : FALSE
+ | TRUE"""
+ production[0] = BooleanNode(Metadata(production.lineno(1)), QLBoolean, QLBoolean(production[1]))
+
+ @staticmethod
+ def p_date_literal(production):
+ """expression : DATE_LITERAL"""
+ day, month, year = production[1]
+ production[0] = DateNode(Metadata(production.lineno(1)), QLDate, QLDate(day, month, year))
+
+ @staticmethod
+ def p_integer_literal(production):
+ """expression : INTEGER_LITERAL"""
+ production[0] = IntegerNode(Metadata(production.lineno(1)), QLInteger, QLInteger(production[1]))
+
+ @staticmethod
+ def p_decimal_literal(production):
+ """expression : DECIMAL_LITERAL"""
+ production[0] = DecimalNode(Metadata(production.lineno(1)), QLDecimal, QLDecimal(production[1]))
+
+ @staticmethod
+ def p_money_literal(production):
+ """expression : currency DECIMAL_LITERAL
+ | currency INTEGER_LITERAL"""
+ production[0] = MoneyNode(Metadata(production.lineno(1)), QLMoney,
+ QLMoney(production[2], production[1]))
+
+ @staticmethod
+ def p_string_literal(production):
+ """expression : STRING_LITERAL"""
+ production[0] = StringNode(Metadata(production.lineno(1)), QLString, QLString([1]))
+
+ # Currencies
+ @staticmethod
+ def p_currency(production):
+ """currency : DOLLAR
+ | RUBLE"""
+ production[0] = production[1]
+
+ # Types
+ @staticmethod
+ def p_boolean(production):
+ """type : BOOLEAN"""
+ production[0] = QLBoolean
+
+ @staticmethod
+ def p_decimal(production):
+ """type : DECIMAL"""
+ production[0] = QLDecimal
+
+ @staticmethod
+ def p_string(production):
+ """type : STRING"""
+ production[0] = QLString
+
+ @staticmethod
+ def p_date(production):
+ """type : DATE"""
+ production[0] = QLDate
+
+ @staticmethod
+ def p_money(production):
+ """type : MONEY"""
+ production[0] = QLMoney
+
+ @staticmethod
+ def p_integer(production):
+ """type : INTEGER"""
+ production[0] = QLInteger
+
+ # Error
+ def p_error(self, production):
+ if production is None:
+ self.errors.append('Syntax error.')
+ else:
+ self.errors.append('Syntax error at line {}, token={}.'.format(production.lineno, production.type))
+
+ def p_form_label(self, production):
+ """form : FORM LEFT_BRACE"""
+ self.errors.append('Missing form identifier at line {}.'.format(production.lineno(1)))
+
+ def p_empty_form(self, production):
+ """form : FORM IDENTIFIER LEFT_BRACE RIGHT_BRACE"""
+ self.errors.append('Empty form at line {}.'.format(production.lineno(1)))
+
+ def p_empty_if(self, production):
+ """statement : IF condition LEFT_BRACE RIGHT_BRACE"""
+ self.errors.append('Empty if block at line {}.'.format(production.lineno(1)))
+
+ def p_empty_condition(self, production):
+ """condition : LEFT_BRACKET RIGHT_BRACKET"""
+ self.errors.append('Empty conditional at line {}.'.format(production.lineno(1)))
diff --git a/ql/parser/parsetab.py b/ql/parser/parsetab.py
new file mode 100644
index 0000000..b978ef8
--- /dev/null
+++ b/ql/parser/parsetab.py
@@ -0,0 +1,76 @@
+
+# parsetab.py
+# This file is automatically generated. Do not edit.
+# pylint: disable=W,C,R
+_tabversion = '3.10'
+
+_lr_method = 'LALR'
+
+_lr_signature = 'leftORleftANDnonassocEQUALSNOT_EQUALSnonassocLESS_EQUALSLESS_THANGREATER_EQUALSGREATER_THANleftPLUSMINUSleftTIMESDIVIDErightNOTAND ASSIGN BOOLEAN COLON DATE DATE_LITERAL DECIMAL DECIMAL_LITERAL DIVIDE DOLLAR EQUALS FALSE FORM GREATER_EQUALS GREATER_THAN IDENTIFIER IF INTEGER INTEGER_LITERAL LEFT_BRACE LEFT_BRACKET LESS_EQUALS LESS_THAN MINUS MONEY NOT NOT_EQUALS OR PLUS RIGHT_BRACE RIGHT_BRACKET RUBLE STRING STRING_LITERAL TIMES TRUEform : FORM IDENTIFIER blockblock : LEFT_BRACE statements RIGHT_BRACEstatements : statement statements\n | statementstatement : if\n | questionquestion : STRING_LITERAL IDENTIFIER COLON typequestion : STRING_LITERAL IDENTIFIER COLON type ASSIGN expressionif : IF condition blockcondition : LEFT_BRACKET expression RIGHT_BRACKETexpression : LEFT_BRACKET expression RIGHT_BRACKETexpression : IDENTIFIERexpression : NOT expressionexpression : MINUS expressionexpression : expression AND expressionexpression : expression OR expressionexpression : expression PLUS expressionexpression : expression MINUS expressionexpression : expression TIMES expressionexpression : expression DIVIDE expressionexpression : expression EQUALS expressionexpression : expression NOT_EQUALS expressionexpression : expression LESS_EQUALS expressionexpression : expression LESS_THAN expressionexpression : expression GREATER_EQUALS expressionexpression : expression GREATER_THAN expressionexpression : FALSE\n | TRUEexpression : DATE_LITERALexpression : INTEGER_LITERALexpression : DECIMAL_LITERALexpression : currency DECIMAL_LITERAL\n | currency INTEGER_LITERALexpression : STRING_LITERALcurrency : DOLLAR\n | RUBLEtype : BOOLEANtype : DECIMALtype : STRINGtype : DATEtype : MONEYtype : INTEGERform : FORM LEFT_BRACEform : FORM IDENTIFIER LEFT_BRACE RIGHT_BRACEstatement : IF condition LEFT_BRACE RIGHT_BRACEcondition : LEFT_BRACKET RIGHT_BRACKET'
+
+_lr_action_items = {'RIGHT_BRACKET':([17,24,26,28,31,32,33,34,35,38,39,40,41,42,63,64,65,66,67,68,69,70,71,72,73,74,75,],[21,-29,-30,-34,-31,-28,43,-12,-27,-32,-33,-14,-13,63,-11,-17,-22,-21,-24,-18,-19,-16,-20,-15,-26,-23,-25,]),'TRUE':([17,25,27,30,44,45,46,47,48,49,50,51,52,53,54,55,76,],[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,]),'LEFT_BRACE':([1,3,16,21,43,],[4,5,19,-46,-10,]),'RUBLE':([17,25,27,30,44,45,46,47,48,49,50,51,52,53,54,55,76,],[23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,]),'DATE_LITERAL':([17,25,27,30,44,45,46,47,48,49,50,51,52,53,54,55,76,],[24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,]),'MINUS':([17,24,25,26,27,28,30,31,32,33,34,35,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,],[25,-29,25,-30,25,-34,25,-31,-28,48,-12,-27,-32,-33,-14,-13,48,25,25,25,25,25,25,25,25,25,25,25,25,-11,-17,48,48,48,-18,-19,48,-20,48,48,48,48,25,48,]),'INTEGER_LITERAL':([17,22,23,25,27,29,30,44,45,46,47,48,49,50,51,52,53,54,55,76,],[26,39,-36,26,26,-35,26,26,26,26,26,26,26,26,26,26,26,26,26,26,]),'TIMES':([24,26,28,31,32,33,34,35,38,39,40,41,42,63,64,65,66,67,68,69,70,71,72,73,74,75,77,],[-29,-30,-34,-31,-28,49,-12,-27,-32,-33,49,-13,49,-11,49,49,49,49,49,-19,49,-20,49,49,49,49,49,]),'NOT':([17,25,27,30,44,45,46,47,48,49,50,51,52,53,54,55,76,],[27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,]),'DOLLAR':([17,25,27,30,44,45,46,47,48,49,50,51,52,53,54,55,76,],[29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,]),'MONEY':([36,],[60,]),'INTEGER':([36,],[61,]),'AND':([24,26,28,31,32,33,34,35,38,39,40,41,42,63,64,65,66,67,68,69,70,71,72,73,74,75,77,],[-29,-30,-34,-31,-28,52,-12,-27,-32,-33,-14,-13,52,-11,-17,-22,-21,-24,-18,-19,52,-20,-15,-26,-23,-25,52,]),'NOT_EQUALS':([24,26,28,31,32,33,34,35,38,39,40,41,42,63,64,65,66,67,68,69,70,71,72,73,74,75,77,],[-29,-30,-34,-31,-28,45,-12,-27,-32,-33,-14,-13,45,-11,-17,None,None,-24,-18,-19,45,-20,45,-26,-23,-25,45,]),'ASSIGN':([56,57,58,59,60,61,62,],[-40,-38,-39,76,-41,-42,-37,]),'BOOLEAN':([36,],[62,]),'FORM':([0,],[1,]),'IF':([5,7,8,10,14,19,20,24,26,28,31,32,34,35,37,38,39,40,41,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,77,],[11,-5,-6,11,-2,11,-9,-29,-30,-34,-31,-28,-12,-27,-45,-32,-33,-14,-13,-40,-38,-39,-7,-41,-42,-37,-11,-17,-22,-21,-24,-18,-19,-16,-20,-15,-26,-23,-25,-8,]),'LEFT_BRACKET':([11,17,25,27,30,44,45,46,47,48,49,50,51,52,53,54,55,76,],[17,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,]),'PLUS':([24,26,28,31,32,33,34,35,38,39,40,41,42,63,64,65,66,67,68,69,70,71,72,73,74,75,77,],[-29,-30,-34,-31,-28,44,-12,-27,-32,-33,-14,-13,44,-11,-17,44,44,44,-18,-19,44,-20,44,44,44,44,44,]),'$end':([2,4,6,13,14,],[0,-43,-1,-44,-2,]),'EQUALS':([24,26,28,31,32,33,34,35,38,39,40,41,42,63,64,65,66,67,68,69,70,71,72,73,74,75,77,],[-29,-30,-34,-31,-28,46,-12,-27,-32,-33,-14,-13,46,-11,-17,None,None,-24,-18,-19,46,-20,46,-26,-23,-25,46,]),'IDENTIFIER':([1,12,17,25,27,30,44,45,46,47,48,49,50,51,52,53,54,55,76,],[3,18,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,]),'LESS_THAN':([24,26,28,31,32,33,34,35,38,39,40,41,42,63,64,65,66,67,68,69,70,71,72,73,74,75,77,],[-29,-30,-34,-31,-28,47,-12,-27,-32,-33,-14,-13,47,-11,-17,47,47,None,-18,-19,47,-20,47,None,None,None,47,]),'STRING':([36,],[58,]),'COLON':([18,],[36,]),'DATE':([36,],[56,]),'STRING_LITERAL':([5,7,8,10,14,17,19,20,24,25,26,27,28,30,31,32,34,35,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,],[12,-5,-6,12,-2,28,12,-9,-29,28,-30,28,-34,28,-31,-28,-12,-27,-45,-32,-33,-14,-13,28,28,28,28,28,28,28,28,28,28,28,28,-40,-38,-39,-7,-41,-42,-37,-11,-17,-22,-21,-24,-18,-19,-16,-20,-15,-26,-23,-25,28,-8,]),'DECIMAL_LITERAL':([17,22,23,25,27,29,30,44,45,46,47,48,49,50,51,52,53,54,55,76,],[31,38,-36,31,31,-35,31,31,31,31,31,31,31,31,31,31,31,31,31,31,]),'OR':([24,26,28,31,32,33,34,35,38,39,40,41,42,63,64,65,66,67,68,69,70,71,72,73,74,75,77,],[-29,-30,-34,-31,-28,50,-12,-27,-32,-33,-14,-13,50,-11,-17,-22,-21,-24,-18,-19,-16,-20,-15,-26,-23,-25,50,]),'FALSE':([17,25,27,30,44,45,46,47,48,49,50,51,52,53,54,55,76,],[35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,]),'DECIMAL':([36,],[57,]),'DIVIDE':([24,26,28,31,32,33,34,35,38,39,40,41,42,63,64,65,66,67,68,69,70,71,72,73,74,75,77,],[-29,-30,-34,-31,-28,51,-12,-27,-32,-33,51,-13,51,-11,51,51,51,51,51,-19,51,-20,51,51,51,51,51,]),'LESS_EQUALS':([24,26,28,31,32,33,34,35,38,39,40,41,42,63,64,65,66,67,68,69,70,71,72,73,74,75,77,],[-29,-30,-34,-31,-28,54,-12,-27,-32,-33,-14,-13,54,-11,-17,54,54,None,-18,-19,54,-20,54,None,None,None,54,]),'RIGHT_BRACE':([5,7,8,9,10,14,15,19,20,24,26,28,31,32,34,35,37,38,39,40,41,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,77,],[13,-5,-6,14,-4,-2,-3,37,-9,-29,-30,-34,-31,-28,-12,-27,-45,-32,-33,-14,-13,-40,-38,-39,-7,-41,-42,-37,-11,-17,-22,-21,-24,-18,-19,-16,-20,-15,-26,-23,-25,-8,]),'GREATER_EQUALS':([24,26,28,31,32,33,34,35,38,39,40,41,42,63,64,65,66,67,68,69,70,71,72,73,74,75,77,],[-29,-30,-34,-31,-28,55,-12,-27,-32,-33,-14,-13,55,-11,-17,55,55,None,-18,-19,55,-20,55,None,None,None,55,]),'GREATER_THAN':([24,26,28,31,32,33,34,35,38,39,40,41,42,63,64,65,66,67,68,69,70,71,72,73,74,75,77,],[-29,-30,-34,-31,-28,53,-12,-27,-32,-33,-14,-13,53,-11,-17,53,53,None,-18,-19,53,-20,53,None,None,None,53,]),}
+
+_lr_action = {}
+for _k, _v in _lr_action_items.items():
+ for _x,_y in zip(_v[0],_v[1]):
+ if not _x in _lr_action: _lr_action[_x] = {}
+ _lr_action[_x][_k] = _y
+del _lr_action_items
+
+_lr_goto_items = {'if':([5,10,19,],[7,7,7,]),'condition':([11,],[16,]),'question':([5,10,19,],[8,8,8,]),'expression':([17,25,27,30,44,45,46,47,48,49,50,51,52,53,54,55,76,],[33,40,41,42,64,65,66,67,68,69,70,71,72,73,74,75,77,]),'currency':([17,25,27,30,44,45,46,47,48,49,50,51,52,53,54,55,76,],[22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,]),'type':([36,],[59,]),'statements':([5,10,19,],[9,15,9,]),'statement':([5,10,19,],[10,10,10,]),'form':([0,],[2,]),'block':([3,16,],[6,20,]),}
+
+_lr_goto = {}
+for _k, _v in _lr_goto_items.items():
+ for _x, _y in zip(_v[0], _v[1]):
+ if not _x in _lr_goto: _lr_goto[_x] = {}
+ _lr_goto[_x][_k] = _y
+del _lr_goto_items
+_lr_productions = [
+ ("S' -> form","S'",1,None,None,None),
+ ('form -> FORM IDENTIFIER block','form',3,'p_form','parser.py',78),
+ ('block -> LEFT_BRACE statements RIGHT_BRACE','block',3,'p_block','parser.py',83),
+ ('statements -> statement statements','statements',2,'p_statements','parser.py',89),
+ ('statements -> statement','statements',1,'p_statements','parser.py',90),
+ ('statement -> if','statement',1,'p_statement','parser.py',98),
+ ('statement -> question','statement',1,'p_statement','parser.py',99),
+ ('question -> STRING_LITERAL IDENTIFIER COLON type','question',4,'p_question','parser.py',105),
+ ('question -> STRING_LITERAL IDENTIFIER COLON type ASSIGN expression','question',6,'p_question_computed','parser.py',111),
+ ('if -> IF condition block','if',3,'p_if','parser.py',118),
+ ('condition -> LEFT_BRACKET expression RIGHT_BRACKET','condition',3,'p_condition','parser.py',123),
+ ('expression -> LEFT_BRACKET expression RIGHT_BRACKET','expression',3,'p_parenthesis','parser.py',129),
+ ('expression -> IDENTIFIER','expression',1,'p_variable','parser.py',134),
+ ('expression -> NOT expression','expression',2,'p_not','parser.py',141),
+ ('expression -> MINUS expression','expression',2,'p_negative','parser.py',147),
+ ('expression -> expression AND expression','expression',3,'p_and','parser.py',154),
+ ('expression -> expression OR expression','expression',3,'p_or','parser.py',160),
+ ('expression -> expression PLUS expression','expression',3,'p_plus','parser.py',166),
+ ('expression -> expression MINUS expression','expression',3,'p_minus','parser.py',172),
+ ('expression -> expression TIMES expression','expression',3,'p_times','parser.py',178),
+ ('expression -> expression DIVIDE expression','expression',3,'p_divide','parser.py',184),
+ ('expression -> expression EQUALS expression','expression',3,'p_equals','parser.py',190),
+ ('expression -> expression NOT_EQUALS expression','expression',3,'p_not_equals','parser.py',196),
+ ('expression -> expression LESS_EQUALS expression','expression',3,'p_less_equals','parser.py',202),
+ ('expression -> expression LESS_THAN expression','expression',3,'p_less_than','parser.py',208),
+ ('expression -> expression GREATER_EQUALS expression','expression',3,'p_greater_equals','parser.py',214),
+ ('expression -> expression GREATER_THAN expression','expression',3,'p_greater_than','parser.py',220),
+ ('expression -> FALSE','expression',1,'p_boolean_literal','parser.py',227),
+ ('expression -> TRUE','expression',1,'p_boolean_literal','parser.py',228),
+ ('expression -> DATE_LITERAL','expression',1,'p_date_literal','parser.py',233),
+ ('expression -> INTEGER_LITERAL','expression',1,'p_integer_literal','parser.py',238),
+ ('expression -> DECIMAL_LITERAL','expression',1,'p_decimal_literal','parser.py',243),
+ ('expression -> currency DECIMAL_LITERAL','expression',2,'p_money_literal','parser.py',248),
+ ('expression -> currency INTEGER_LITERAL','expression',2,'p_money_literal','parser.py',249),
+ ('expression -> STRING_LITERAL','expression',1,'p_string_literal','parser.py',255),
+ ('currency -> DOLLAR','currency',1,'p_currency','parser.py',261),
+ ('currency -> RUBLE','currency',1,'p_currency','parser.py',262),
+ ('type -> BOOLEAN','type',1,'p_boolean','parser.py',268),
+ ('type -> DECIMAL','type',1,'p_decimal','parser.py',273),
+ ('type -> STRING','type',1,'p_string','parser.py',278),
+ ('type -> DATE','type',1,'p_date','parser.py',283),
+ ('type -> MONEY','type',1,'p_money','parser.py',288),
+ ('type -> INTEGER','type',1,'p_integer','parser.py',293),
+ ('form -> FORM LEFT_BRACE','form',2,'p_form_label','parser.py',305),
+ ('form -> FORM IDENTIFIER LEFT_BRACE RIGHT_BRACE','form',4,'p_empty_form','parser.py',309),
+ ('statement -> IF condition LEFT_BRACE RIGHT_BRACE','statement',4,'p_empty_if','parser.py',313),
+ ('condition -> LEFT_BRACKET RIGHT_BRACKET','condition',2,'p_empty_condition','parser.py',317),
+]