diff options
Diffstat (limited to 'ql/parser')
| -rw-r--r-- | ql/parser/__pycache__/lexer.cpython-35.pyc | bin | 0 -> 4275 bytes | |||
| -rw-r--r-- | ql/parser/__pycache__/metadata.cpython-35.pyc | bin | 0 -> 612 bytes | |||
| -rw-r--r-- | ql/parser/__pycache__/parser.cpython-35.pyc | bin | 0 -> 14851 bytes | |||
| -rw-r--r-- | ql/parser/__pycache__/parsetab.cpython-35.pyc | bin | 0 -> 12432 bytes | |||
| -rw-r--r-- | ql/parser/lexer.py | 153 | ||||
| -rw-r--r-- | ql/parser/metadata.py | 7 | ||||
| -rw-r--r-- | ql/parser/parser.out | 2214 | ||||
| -rw-r--r-- | ql/parser/parser.py | 319 | ||||
| -rw-r--r-- | ql/parser/parsetab.py | 76 |
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 Binary files differnew file mode 100644 index 0000000..f2d9220 --- /dev/null +++ b/ql/parser/__pycache__/lexer.cpython-35.pyc diff --git a/ql/parser/__pycache__/metadata.cpython-35.pyc b/ql/parser/__pycache__/metadata.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..0f1f298 --- /dev/null +++ b/ql/parser/__pycache__/metadata.cpython-35.pyc diff --git a/ql/parser/__pycache__/parser.cpython-35.pyc b/ql/parser/__pycache__/parser.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..6eb96b9 --- /dev/null +++ b/ql/parser/__pycache__/parser.cpython-35.pyc diff --git a/ql/parser/__pycache__/parsetab.cpython-35.pyc b/ql/parser/__pycache__/parsetab.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..bd4db77 --- /dev/null +++ b/ql/parser/__pycache__/parsetab.cpython-35.pyc 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), +] |