From 9ee36276cc6128267fa866970d7a1d46ca70516d Mon Sep 17 00:00:00 2001 From: keyvan1379 Date: Fri, 2 Jul 2021 15:00:05 -0400 Subject: [PATCH 1/2] HW4-keyvan-dadashzadeh-97522148 --- HW4-keyvan-dadashzadeh-97522148/Q2/Q2.g4 | 76 + HW4-keyvan-dadashzadeh-97522148/Q3/Q3.g4 | 341 ++++ HW4-keyvan-dadashzadeh-97522148/Q3/Q3.py | 30 + .../Q3/QuickSort.java | 100 + HW4-keyvan-dadashzadeh-97522148/Q3/fix.py | 38 + .../Q3/gen/Q3.interp | 99 + .../Q3/gen/Q3.tokens | 67 + .../Q3/gen/Q3Lexer.interp | 130 ++ .../Q3/gen/Q3Lexer.py | 214 ++ .../Q3/gen/Q3Lexer.tokens | 67 + .../Q3/gen/Q3Listener.py | 138 ++ .../Q3/gen/Q3Parser.py | 1749 +++++++++++++++++ .../Q3/gen/__init__.py | 0 .../Q3/gen/__pycache__/Q3Lexer.cpython-38.pyc | Bin 0 -> 7814 bytes .../gen/__pycache__/Q3Listener.cpython-38.pyc | Bin 0 -> 4794 bytes .../gen/__pycache__/Q3Parser.cpython-38.pyc | Bin 0 -> 51066 bytes .../gen/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 144 bytes HW4-keyvan-dadashzadeh-97522148/Q4/Q4.g4 | 76 + HW4-keyvan-dadashzadeh-97522148/Q4/Q4.py | 181 ++ .../Q4/QuickSort.java | 100 + HW4-keyvan-dadashzadeh-97522148/Q4/ast1.png | Bin 0 -> 63822 bytes .../Q4/ast_list.py | 207 ++ .../Q4/gen/Q4.interp | 102 + .../Q4/gen/Q4.tokens | 76 + .../Q4/gen/Q4Lexer.interp | 142 ++ .../Q4/gen/Q4Lexer.py | 219 +++ .../Q4/gen/Q4Lexer.tokens | 76 + .../Q4/gen/Q4Listener.py | 282 +++ .../Q4/gen/Q4Parser.py | 1715 ++++++++++++++++ .../Q4/gen/__pycache__/Q4Lexer.cpython-38.pyc | Bin 0 -> 7999 bytes .../gen/__pycache__/Q4Listener.cpython-38.pyc | Bin 0 -> 10224 bytes .../gen/__pycache__/Q4Parser.cpython-38.pyc | Bin 0 -> 52099 bytes 32 files changed, 6225 insertions(+) create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q2/Q2.g4 create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/Q3.g4 create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/Q3.py create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/QuickSort.java create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/fix.py create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3.interp create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3.tokens create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Lexer.interp create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Lexer.py create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Lexer.tokens create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Listener.py create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Parser.py create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/__init__.py create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Lexer.cpython-38.pyc create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Listener.cpython-38.pyc create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Parser.cpython-38.pyc create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/__init__.cpython-38.pyc create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q4/Q4.g4 create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q4/Q4.py create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q4/QuickSort.java create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q4/ast1.png create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q4/ast_list.py create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4.interp create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4.tokens create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Lexer.interp create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Lexer.py create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Lexer.tokens create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Listener.py create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Parser.py create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q4/gen/__pycache__/Q4Lexer.cpython-38.pyc create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q4/gen/__pycache__/Q4Listener.cpython-38.pyc create mode 100644 HW4-keyvan-dadashzadeh-97522148/Q4/gen/__pycache__/Q4Parser.cpython-38.pyc diff --git a/HW4-keyvan-dadashzadeh-97522148/Q2/Q2.g4 b/HW4-keyvan-dadashzadeh-97522148/Q2/Q2.g4 new file mode 100644 index 0000000..0db9278 --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q2/Q2.g4 @@ -0,0 +1,76 @@ +grammar Q2; + +program: mainClass ( classDeclaration )* EOF; + +mainClass: + 'class' identifier '{' 'public' 'static' 'void' 'main' '(' 'String' '[' ']' identifier ')' '{' statement '}' '}' + ; + +classDeclaration: 'class' id1=identifier ( 'extends' identifier )? '{' ( varDeclaration )* ( methodDeclaration )* '}'; + +varDeclaration: type identifier ';'; + +methodDeclaration: + 'public' type id1=identifier '(' ( type id2=identifier ( ',' type id3=identifier )* )? ')' '{' ( varDeclaration )* ( statement )* 'return' expression ';' '}' + ; + +type: + 'int' '[' ']' + | 'boolean' + | 'int' + | identifier; + +statement returns [value_attr=str(), type_attr = str()]: + 'if' '(' expression ')' st1=statement 'else' st2=statement #state_if + | '{' ( statement )* '}' #state_brace + | 'while' '(' expression ')' st1=statement #state_while + | 'System.out.println' '(' expression ')' ';' #state_println + | identifier '=' expression ';' #state_equal_assign + | identifier '[' first=expression ']' '=' second=expression ';' #state_access_array_assign + ; + + +expression returns [value_attr=str(), type_attr = str()] + : + id=identifier #expr_term_id + | first=expression '&&' second=expression #expr_term_and + | '!' expression #expr_term_not + | INTEGER_LITERAL #expr_term_int + | first=expression '<' second=expression #expr_term_less + | first=expression '+' second=expression #expr_term_plus + | 'true' #expr_term_true + | first=expression '-' second=expression #expr_term_minus + | 'false' #expr_term_false + | '(' expression ')' #expr_term_paran + | first=expression '*' second=expression #expr_term_multiply + | first=expression '.' id=identifier '(' ( second=expression ( ',' expression )* )? ')'#expr_term_call_function + | 'this' #expr_term_useless_1 + | 'new' 'int' '[' expression ']' #expr_term_useless_2 + | 'new' identifier '(' ')' #expr_term_useless_3 + | first=expression '[' second=expression ']' #expr_term_useless_4 + | expression '.' 'length' #expr_term_useless_5 + ; + + +identifier returns [value_attr=str(), type_attr = str()]: + IDENTIFIER + ; + +/* lexical rules */ +INTEGER_LITERAL : + DIGIT+; + + +IDENTIFIER: LETTER(LETTER | '_' | DIGIT)*; + +fragment LETTER: [a-zA-Z]; + +fragment DIGIT: [0-9]; + +Whitespace: ('\t' | ' ')+ -> skip; + +BlockComment: '/*' .*? '*/' -> skip; + +LineComment: '//' ~ ('\r' | '\n')* -> skip; + +Newline: ('\r' '\n'? | '\n') -> skip; \ No newline at end of file diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/Q3.g4 b/HW4-keyvan-dadashzadeh-97522148/Q3/Q3.g4 new file mode 100644 index 0000000..b824727 --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q3/Q3.g4 @@ -0,0 +1,341 @@ +grammar Q3; + + +@parser::members { +var_dict = {} +temp_counter = 0 +label_counter = 0 +params = 0 +current_function_params = 0 + + +method_body = "" + +def define_variable(self, type, name): + if name not in self.var_dict: + self.var_dict[name] = type + +def create_temp(self): + new_temp = f"_t{self.temp_counter}" + self.temp_counter += 1 + self.current_function_params += 1 + return new_temp + +def create_label(self): + new_label = f"L{self.label_counter}" + self.label_counter += 1 + return new_label + +def add_to_method_body(self, text): + self.method_body += text + "\n" + +def get_method_body(self): + return self.method_body + +def clear_method_body(self): + self.method_body = "" +} + +program: + mainClass ( classDeclaration )* EOF + ; + +mainClass: +{ +print("main:") +self.params = 0 +self.current_function_params = 0 +} + ClassSmt identifier LBrace PublicSmt StaticSmt VoidType MainSmt LPran StringType LBrack RBrack identifier RPran mainDefinition + ; + +mainDefinition: + LBrace statement RBrace RBrace +{ +print(f"\tBeginFunc {self.current_function_params * 4}") +print(self.get_method_body()) +self.clear_method_body() +} + ; + +classDeclaration: + ClassSmt identifier ( ExtendsSmt identifier )? LBrace ( varDeclaration )* ( methodDeclaration )* RBrace + ; + +methodDeclaration: +{ +self.params = 0 +self.current_function_params = 0 +} + methodName LPran ( methodParam ( Comma methodParam )* )? RPran methodDefinition + ; + +methodName: + PublicSmt methodType=type methodID=identifier +{ +print(f"{$methodID.text}:") +} + ; + +methodDefinition + : + LBrace ( varDeclaration )* ( statement )* ReturnSmt first=expression SemiColon RBrace +{ +print(f"\tBeginFunc {self.current_function_params * 4}") +print(self.get_method_body()) +print(f"\tretrun {$first.value_attr}") +self.clear_method_body() +} + ; + +varDeclaration: + varType=type varID=identifier SemiColon +{ +self.define_variable($varType.text, $varID.text) +self.current_function_params += 1 +} + ; + +methodParam: + paramType=type paramID=identifier +{ +self.define_variable($paramType.text, $paramID.text) +} + ; + + +type: + IntegerType LBrack RBrack + | BooleanType + | IntegerType + | identifier; + +statement returns [value_attr=str(), type_attr = str()]: + LBrace ( statement )* RBrace + | + + + + + + IfSmt LPran first=expression RPran +{ +else_label = self.create_label() +temp = self.create_temp() +self.add_to_method_body(f"\t{temp} = {$first.value_attr}") +self.add_to_method_body(f"\tifZ {temp} goto {else_label}") +} + + first_s=statement +{ +end_label = self.create_label() +self.add_to_method_body(f"\t{$first_s.value_attr}") +self.add_to_method_body(f"\tgoto {end_label}") +} + + ElseSmt second_s=statement +{ +self.add_to_method_body(f"{else_label}:") +self.add_to_method_body(f"\t{$second_s.value_attr}") +self.add_to_method_body(f"{end_label}:") +} + + + + + | +{ +while_label = self.create_label() +self.add_to_method_body(f"{while_label}:") +} + WhileSmt LPran first=expression RPran +{ +after_while_label = self.create_label() +temp = self.create_temp() +self.add_to_method_body(f"\t{temp} = {$first.value_attr}") +self.add_to_method_body(f"\tifZ {temp} goto {after_while_label}") +} + first_s=statement +{ +self.add_to_method_body(f"\t{$first_s.value_attr}") +self.add_to_method_body(f"\tgoto {while_label}") +self.add_to_method_body(f"{after_while_label}:") +} + + + + + | 'System.out.println' LPran first=expression RPran SemiColon +{ +self.add_to_method_body(f"\tpush {$first.value_attr}") +self.add_to_method_body(f"\tSystem.out.println") +self.add_to_method_body(f"\tPopParams 4") +} + + + | varID=identifier Equals varEXP=expression SemiColon +{ +#self.add_to_method_body($varID.text) +#self.add_to_method_body($varEXP.value_attr) +if $varEXP.type_attr == "str": #right side is math exper + temp = self.create_temp() + $value_attr = f"{temp} = {$varEXP.value_attr}\n{$varID.text} = {temp}" + self.add_to_method_body(f"\t{temp} = {$varEXP.value_attr}") + self.add_to_method_body(f"\t{$varID.text} = {temp}") +else: + $value_attr = f"{$varID.text} = {$varEXP.value_attr}" + self.add_to_method_body('\t' + $value_attr) +} + + + + | varID=identifier LBrack varEXP=expression RBrack Equals eqEXP=expression SemiColon +{ +$value_attr = f"{$varID.text}[{$varEXP.value_attr}] = {$eqEXP.value_attr}" +self.add_to_method_body('\t' + $value_attr) +} + ; + + + + + +expression returns [value_attr = str(), type_attr = str(), is_var = bool(), is_complete = bool()]: + first=expression ( oper=Operations ) second=expression +{ +#self.add_to_method_body($first.type_attr) +#self.add_to_method_body($second.type_attr) +#self.add_to_method_body($oper.text) +#if $first.type_attr != $second.type_attr: +# self.add_to_method_body('i think we messd up') +#else: +$value_attr = f"{$first.value_attr} {$oper.text} {$second.value_attr}" +$type_attr = "str" +$is_complete = True +} + | first=expression LBrack second=expression RBrack +{ +temp = self.create_temp() +self.add_to_method_body(f"\t{temp} = {$first.value_attr}[{$second.value_attr}]") +$value_attr = temp +} + | first=expression Dot 'length' +{ +} + | first=expression Dot iden=identifier LPran ( functionParams ( Comma functionParams )* )? RPran +{ +$value_attr = self.create_temp() +self.add_to_method_body(f"\t_LCall {$iden.text}") +self.add_to_method_body(f"\tPopParams {$value_attr}") +self.params = 0 +$type_attr = "ret_var" +} + | intt=INTEGER_LITERAL +{ +$value_attr = $intt.text +$type_attr = "int" +} + | tr=TRUE +{ +$value_attr = $tr.text +$type_attr = "boolean" +} + | fa=FALSE +{ +$value_attr = $fa.text +$type_attr = "boolean" +} + | iden=identifier +{ +$value_attr = $iden.text +$is_var = True +$type_attr = self.var_dict[$iden.text] +} + | This +{ +} + | New IntegerType LBrack first=expression RBrack +{ +self.current_function_params += 1 +} + | New identifier LPran RPran +{ +} + | Exclamation first=expression +{ +self.add_to_method_body(f"\t{self.create_temp()} = !{$first.value_attr}") +} + | LPran first=expression RPran +{ +$value_attr = $first.value_attr +$type_attr = $first.type_attr +$is_var = $first.is_var +} + ; + + +functionParams: + paramss=expression +{ +self.params += 1 +self.add_to_method_body(f"\tpush {$paramss.value_attr}") +} + ; + +identifier returns [value_attr=str(), type_attr = str()]: + IDENTIFIER ; + +/* lexical rules */ +INTEGER_LITERAL : + DIGIT+; + +LBrace: '{'; +RBrace: '}'; +LPran: '('; +RPran: ')'; +LBrack: '['; +RBrack: ']'; + +BooleanType:'boolean'; +IntegerType:'int'; +StringType: 'String'; +VoidType: 'void'; + +ClassSmt: 'class'; +ExtendsSmt:'extends'; +MainSmt: 'main'; +PublicSmt: 'public'; +StaticSmt: 'static'; +ReturnSmt: 'return'; + +WhileSmt: 'while'; +IfSmt: 'if'; +ElseSmt: 'else'; + +Equals: '='; +Operations: '&&'|'<'|'+'|'-'|'*'; +Exclamation: '!'; + + +SemiColon: ';'; +Dot: '.'; +Comma: ','; + +TRUE: 'true'; +FALSE:'false'; +This: 'this'; +New: 'new'; + +IDENTIFIER: LETTER(LETTER | '_' | DIGIT)*; + +fragment LETTER: [a-zA-Z]; + +fragment DIGIT: [0-9]; + +Whitespace: ('\t' | ' ')+ -> skip; + +BlockComment: '/*' .*? '*/' -> skip; + +LineComment: '//' ~ ('\r' | '\n')* -> skip; + +Newline: ('\r' '\n'? | '\n') -> skip; \ No newline at end of file diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/Q3.py b/HW4-keyvan-dadashzadeh-97522148/Q3/Q3.py new file mode 100644 index 0000000..2ad843d --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q3/Q3.py @@ -0,0 +1,30 @@ +# !/bin/python3 + +from antlr4 import * +import argparse + +from gen.Q3Listener import Q3Listener +from gen.Q3Lexer import Q3Lexer +from gen.Q3Parser import Q3Parser + +class Q3Lis(Q3Listener): + def __init__(self): + pass + + +if __name__ == '__main__': + argparser = argparse.ArgumentParser() + argparser.add_argument( + '-n', '--file', + help='Input source', default=r'./QuickSort.java') + print("make sure that you fixed indentation in parse file(run fix)") + args = argparser.parse_args() + stream = FileStream("./QuickSort.java", encoding='utf8') + print('Three Address Code:') + lexer = Q3Lexer(stream) + token_stream = CommonTokenStream(lexer) + parser = Q3Parser(token_stream) + parse_tree = parser.program() + my_listener = Q3Lis() + walker = ParseTreeWalker() + walker.walk(t=parse_tree, listener=my_listener) diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/QuickSort.java b/HW4-keyvan-dadashzadeh-97522148/Q3/QuickSort.java new file mode 100644 index 0000000..bed9d46 --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q3/QuickSort.java @@ -0,0 +1,100 @@ + + + +class QuickSort{ + public static void main(String[] a){ + System.out.println(new QS().Start(10)); + } +} +// This class contains the array of integers and +// methods to initialize, print and sort the array +// using Quicksort +class QS{ + int[] number ; + int size ; + // Invoke the Initialization, Sort and Printing + // Methods + public int Start(int sz){ + int aux01 ; + aux01 = this.Init(sz); + aux01 = this.Print(); + System.out.println(9999); + aux01 = size - 1 ; + aux01 = this.Sort(0,aux01); + aux01 = this.Print(); + return 0 ; + } + // Sort array of integers using Quicksort method + public int Sort(int left, int right){ + int v ; + int i ; + int j ; + int nt; + int t ; + boolean cont01; + boolean cont02; + int aux03 ; + t = 0 ; + if (left < right){ + v = number[right] ; + i = left - 1 ; + j = right ; + cont01 = true ; + while (cont01){ + cont02 = true ; + while (cont02){ + i = i + 1 ; + aux03 = number[i] ; + if (!(aux03 1: + filename = sys.argv[1] +else: + filename = input("Enter parser script's filename (Leave empty to automatically find in the current directory): ") + if filename == "": + current_dir_filemames = os.listdir(".") + for name in current_dir_filemames: + if name.endswith("Parser.py"): + filename = name + break + if filename == "": + print("Couldn't find any parser in this directory.\nAborting.") + exit() + else: + print("Fixing " + filename + ".") + +print("Reading...") +file = open(filename, "r") +lines = file.readlines() +file.close() + +print("Processing...") +for i in range(len(lines)): + space_count = 0 + while space_count < len(lines[i]) and lines[i][space_count] == ' ': + space_count += 1 + if space_count > 10 and space_count % 4 == 2: + lines[i] = lines[i][10:] + +print("Writing...") +file = open(filename, "w") +file.writelines(lines) +file.close() + +print("Done.") diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3.interp b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3.interp new file mode 100644 index 0000000..4eab7ae --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3.interp @@ -0,0 +1,99 @@ +token literal names: +null +'System.out.println' +'length' +null +'{' +'}' +'(' +')' +'[' +']' +'boolean' +'int' +'String' +'void' +'class' +'extends' +'main' +'public' +'static' +'return' +'while' +'if' +'else' +'=' +null +'!' +';' +'.' +',' +'true' +'false' +'this' +'new' +null +null +null +null +null + +token symbolic names: +null +null +null +INTEGER_LITERAL +LBrace +RBrace +LPran +RPran +LBrack +RBrack +BooleanType +IntegerType +StringType +VoidType +ClassSmt +ExtendsSmt +MainSmt +PublicSmt +StaticSmt +ReturnSmt +WhileSmt +IfSmt +ElseSmt +Equals +Operations +Exclamation +SemiColon +Dot +Comma +TRUE +FALSE +This +New +IDENTIFIER +Whitespace +BlockComment +LineComment +Newline + +rule names: +program +mainClass +mainDefinition +classDeclaration +methodDeclaration +methodName +methodDefinition +varDeclaration +methodParam +type +statement +expression +functionParams +identifier + + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 39, 270, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 3, 2, 3, 2, 7, 2, 33, 10, 2, 12, 2, 14, 2, 36, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 66, 10, 5, 3, 5, 3, 5, 7, 5, 70, 10, 5, 12, 5, 14, 5, 73, 11, 5, 3, 5, 7, 5, 76, 10, 5, 12, 5, 14, 5, 79, 11, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 89, 10, 6, 12, 6, 14, 6, 92, 11, 6, 5, 6, 94, 10, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 7, 8, 106, 10, 8, 12, 8, 14, 8, 109, 11, 8, 3, 8, 7, 8, 112, 10, 8, 12, 8, 14, 8, 115, 11, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 138, 10, 11, 3, 12, 3, 12, 7, 12, 142, 10, 12, 12, 12, 14, 12, 145, 11, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 190, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 226, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 250, 10, 13, 12, 13, 14, 13, 253, 11, 13, 5, 13, 255, 10, 13, 3, 13, 3, 13, 3, 13, 7, 13, 260, 10, 13, 12, 13, 14, 13, 263, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 2, 3, 24, 16, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 2, 2, 2, 286, 2, 30, 3, 2, 2, 2, 4, 39, 3, 2, 2, 2, 6, 55, 3, 2, 2, 2, 8, 61, 3, 2, 2, 2, 10, 82, 3, 2, 2, 2, 12, 98, 3, 2, 2, 2, 14, 103, 3, 2, 2, 2, 16, 122, 3, 2, 2, 2, 18, 127, 3, 2, 2, 2, 20, 137, 3, 2, 2, 2, 22, 189, 3, 2, 2, 2, 24, 225, 3, 2, 2, 2, 26, 264, 3, 2, 2, 2, 28, 267, 3, 2, 2, 2, 30, 34, 5, 4, 3, 2, 31, 33, 5, 8, 5, 2, 32, 31, 3, 2, 2, 2, 33, 36, 3, 2, 2, 2, 34, 32, 3, 2, 2, 2, 34, 35, 3, 2, 2, 2, 35, 37, 3, 2, 2, 2, 36, 34, 3, 2, 2, 2, 37, 38, 7, 2, 2, 3, 38, 3, 3, 2, 2, 2, 39, 40, 8, 3, 1, 2, 40, 41, 7, 16, 2, 2, 41, 42, 5, 28, 15, 2, 42, 43, 7, 6, 2, 2, 43, 44, 7, 19, 2, 2, 44, 45, 7, 20, 2, 2, 45, 46, 7, 15, 2, 2, 46, 47, 7, 18, 2, 2, 47, 48, 7, 8, 2, 2, 48, 49, 7, 14, 2, 2, 49, 50, 7, 10, 2, 2, 50, 51, 7, 11, 2, 2, 51, 52, 5, 28, 15, 2, 52, 53, 7, 9, 2, 2, 53, 54, 5, 6, 4, 2, 54, 5, 3, 2, 2, 2, 55, 56, 7, 6, 2, 2, 56, 57, 5, 22, 12, 2, 57, 58, 7, 7, 2, 2, 58, 59, 7, 7, 2, 2, 59, 60, 8, 4, 1, 2, 60, 7, 3, 2, 2, 2, 61, 62, 7, 16, 2, 2, 62, 65, 5, 28, 15, 2, 63, 64, 7, 17, 2, 2, 64, 66, 5, 28, 15, 2, 65, 63, 3, 2, 2, 2, 65, 66, 3, 2, 2, 2, 66, 67, 3, 2, 2, 2, 67, 71, 7, 6, 2, 2, 68, 70, 5, 16, 9, 2, 69, 68, 3, 2, 2, 2, 70, 73, 3, 2, 2, 2, 71, 69, 3, 2, 2, 2, 71, 72, 3, 2, 2, 2, 72, 77, 3, 2, 2, 2, 73, 71, 3, 2, 2, 2, 74, 76, 5, 10, 6, 2, 75, 74, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 80, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 80, 81, 7, 7, 2, 2, 81, 9, 3, 2, 2, 2, 82, 83, 8, 6, 1, 2, 83, 84, 5, 12, 7, 2, 84, 93, 7, 8, 2, 2, 85, 90, 5, 18, 10, 2, 86, 87, 7, 30, 2, 2, 87, 89, 5, 18, 10, 2, 88, 86, 3, 2, 2, 2, 89, 92, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 94, 3, 2, 2, 2, 92, 90, 3, 2, 2, 2, 93, 85, 3, 2, 2, 2, 93, 94, 3, 2, 2, 2, 94, 95, 3, 2, 2, 2, 95, 96, 7, 9, 2, 2, 96, 97, 5, 14, 8, 2, 97, 11, 3, 2, 2, 2, 98, 99, 7, 19, 2, 2, 99, 100, 5, 20, 11, 2, 100, 101, 5, 28, 15, 2, 101, 102, 8, 7, 1, 2, 102, 13, 3, 2, 2, 2, 103, 107, 7, 6, 2, 2, 104, 106, 5, 16, 9, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 113, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 112, 5, 22, 12, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 7, 21, 2, 2, 117, 118, 5, 24, 13, 2, 118, 119, 7, 28, 2, 2, 119, 120, 7, 7, 2, 2, 120, 121, 8, 8, 1, 2, 121, 15, 3, 2, 2, 2, 122, 123, 5, 20, 11, 2, 123, 124, 5, 28, 15, 2, 124, 125, 7, 28, 2, 2, 125, 126, 8, 9, 1, 2, 126, 17, 3, 2, 2, 2, 127, 128, 5, 20, 11, 2, 128, 129, 5, 28, 15, 2, 129, 130, 8, 10, 1, 2, 130, 19, 3, 2, 2, 2, 131, 132, 7, 13, 2, 2, 132, 133, 7, 10, 2, 2, 133, 138, 7, 11, 2, 2, 134, 138, 7, 12, 2, 2, 135, 138, 7, 13, 2, 2, 136, 138, 5, 28, 15, 2, 137, 131, 3, 2, 2, 2, 137, 134, 3, 2, 2, 2, 137, 135, 3, 2, 2, 2, 137, 136, 3, 2, 2, 2, 138, 21, 3, 2, 2, 2, 139, 143, 7, 6, 2, 2, 140, 142, 5, 22, 12, 2, 141, 140, 3, 2, 2, 2, 142, 145, 3, 2, 2, 2, 143, 141, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 146, 3, 2, 2, 2, 145, 143, 3, 2, 2, 2, 146, 190, 7, 7, 2, 2, 147, 148, 7, 23, 2, 2, 148, 149, 7, 8, 2, 2, 149, 150, 5, 24, 13, 2, 150, 151, 7, 9, 2, 2, 151, 152, 8, 12, 1, 2, 152, 153, 5, 22, 12, 2, 153, 154, 8, 12, 1, 2, 154, 155, 7, 24, 2, 2, 155, 156, 5, 22, 12, 2, 156, 157, 8, 12, 1, 2, 157, 190, 3, 2, 2, 2, 158, 159, 8, 12, 1, 2, 159, 160, 7, 22, 2, 2, 160, 161, 7, 8, 2, 2, 161, 162, 5, 24, 13, 2, 162, 163, 7, 9, 2, 2, 163, 164, 8, 12, 1, 2, 164, 165, 5, 22, 12, 2, 165, 166, 8, 12, 1, 2, 166, 190, 3, 2, 2, 2, 167, 168, 7, 3, 2, 2, 168, 169, 7, 8, 2, 2, 169, 170, 5, 24, 13, 2, 170, 171, 7, 9, 2, 2, 171, 172, 7, 28, 2, 2, 172, 173, 8, 12, 1, 2, 173, 190, 3, 2, 2, 2, 174, 175, 5, 28, 15, 2, 175, 176, 7, 25, 2, 2, 176, 177, 5, 24, 13, 2, 177, 178, 7, 28, 2, 2, 178, 179, 8, 12, 1, 2, 179, 190, 3, 2, 2, 2, 180, 181, 5, 28, 15, 2, 181, 182, 7, 10, 2, 2, 182, 183, 5, 24, 13, 2, 183, 184, 7, 11, 2, 2, 184, 185, 7, 25, 2, 2, 185, 186, 5, 24, 13, 2, 186, 187, 7, 28, 2, 2, 187, 188, 8, 12, 1, 2, 188, 190, 3, 2, 2, 2, 189, 139, 3, 2, 2, 2, 189, 147, 3, 2, 2, 2, 189, 158, 3, 2, 2, 2, 189, 167, 3, 2, 2, 2, 189, 174, 3, 2, 2, 2, 189, 180, 3, 2, 2, 2, 190, 23, 3, 2, 2, 2, 191, 192, 8, 13, 1, 2, 192, 193, 7, 5, 2, 2, 193, 226, 8, 13, 1, 2, 194, 195, 7, 31, 2, 2, 195, 226, 8, 13, 1, 2, 196, 197, 7, 32, 2, 2, 197, 226, 8, 13, 1, 2, 198, 199, 5, 28, 15, 2, 199, 200, 8, 13, 1, 2, 200, 226, 3, 2, 2, 2, 201, 202, 7, 33, 2, 2, 202, 226, 8, 13, 1, 2, 203, 204, 7, 34, 2, 2, 204, 205, 7, 13, 2, 2, 205, 206, 7, 10, 2, 2, 206, 207, 5, 24, 13, 2, 207, 208, 7, 11, 2, 2, 208, 209, 8, 13, 1, 2, 209, 226, 3, 2, 2, 2, 210, 211, 7, 34, 2, 2, 211, 212, 5, 28, 15, 2, 212, 213, 7, 8, 2, 2, 213, 214, 7, 9, 2, 2, 214, 215, 8, 13, 1, 2, 215, 226, 3, 2, 2, 2, 216, 217, 7, 27, 2, 2, 217, 218, 5, 24, 13, 4, 218, 219, 8, 13, 1, 2, 219, 226, 3, 2, 2, 2, 220, 221, 7, 8, 2, 2, 221, 222, 5, 24, 13, 2, 222, 223, 7, 9, 2, 2, 223, 224, 8, 13, 1, 2, 224, 226, 3, 2, 2, 2, 225, 191, 3, 2, 2, 2, 225, 194, 3, 2, 2, 2, 225, 196, 3, 2, 2, 2, 225, 198, 3, 2, 2, 2, 225, 201, 3, 2, 2, 2, 225, 203, 3, 2, 2, 2, 225, 210, 3, 2, 2, 2, 225, 216, 3, 2, 2, 2, 225, 220, 3, 2, 2, 2, 226, 261, 3, 2, 2, 2, 227, 228, 12, 15, 2, 2, 228, 229, 7, 26, 2, 2, 229, 230, 5, 24, 13, 16, 230, 231, 8, 13, 1, 2, 231, 260, 3, 2, 2, 2, 232, 233, 12, 14, 2, 2, 233, 234, 7, 10, 2, 2, 234, 235, 5, 24, 13, 2, 235, 236, 7, 11, 2, 2, 236, 237, 8, 13, 1, 2, 237, 260, 3, 2, 2, 2, 238, 239, 12, 13, 2, 2, 239, 240, 7, 29, 2, 2, 240, 241, 7, 4, 2, 2, 241, 260, 8, 13, 1, 2, 242, 243, 12, 12, 2, 2, 243, 244, 7, 29, 2, 2, 244, 245, 5, 28, 15, 2, 245, 254, 7, 8, 2, 2, 246, 251, 5, 26, 14, 2, 247, 248, 7, 30, 2, 2, 248, 250, 5, 26, 14, 2, 249, 247, 3, 2, 2, 2, 250, 253, 3, 2, 2, 2, 251, 249, 3, 2, 2, 2, 251, 252, 3, 2, 2, 2, 252, 255, 3, 2, 2, 2, 253, 251, 3, 2, 2, 2, 254, 246, 3, 2, 2, 2, 254, 255, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 7, 9, 2, 2, 257, 258, 8, 13, 1, 2, 258, 260, 3, 2, 2, 2, 259, 227, 3, 2, 2, 2, 259, 232, 3, 2, 2, 2, 259, 238, 3, 2, 2, 2, 259, 242, 3, 2, 2, 2, 260, 263, 3, 2, 2, 2, 261, 259, 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 25, 3, 2, 2, 2, 263, 261, 3, 2, 2, 2, 264, 265, 5, 24, 13, 2, 265, 266, 8, 14, 1, 2, 266, 27, 3, 2, 2, 2, 267, 268, 7, 35, 2, 2, 268, 29, 3, 2, 2, 2, 18, 34, 65, 71, 77, 90, 93, 107, 113, 137, 143, 189, 225, 251, 254, 259, 261] \ No newline at end of file diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3.tokens b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3.tokens new file mode 100644 index 0000000..e11438b --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3.tokens @@ -0,0 +1,67 @@ +T__0=1 +T__1=2 +INTEGER_LITERAL=3 +LBrace=4 +RBrace=5 +LPran=6 +RPran=7 +LBrack=8 +RBrack=9 +BooleanType=10 +IntegerType=11 +StringType=12 +VoidType=13 +ClassSmt=14 +ExtendsSmt=15 +MainSmt=16 +PublicSmt=17 +StaticSmt=18 +ReturnSmt=19 +WhileSmt=20 +IfSmt=21 +ElseSmt=22 +Equals=23 +Operations=24 +Exclamation=25 +SemiColon=26 +Dot=27 +Comma=28 +TRUE=29 +FALSE=30 +This=31 +New=32 +IDENTIFIER=33 +Whitespace=34 +BlockComment=35 +LineComment=36 +Newline=37 +'System.out.println'=1 +'length'=2 +'{'=4 +'}'=5 +'('=6 +')'=7 +'['=8 +']'=9 +'boolean'=10 +'int'=11 +'String'=12 +'void'=13 +'class'=14 +'extends'=15 +'main'=16 +'public'=17 +'static'=18 +'return'=19 +'while'=20 +'if'=21 +'else'=22 +'='=23 +'!'=25 +';'=26 +'.'=27 +','=28 +'true'=29 +'false'=30 +'this'=31 +'new'=32 diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Lexer.interp b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Lexer.interp new file mode 100644 index 0000000..1874484 --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Lexer.interp @@ -0,0 +1,130 @@ +token literal names: +null +'System.out.println' +'length' +null +'{' +'}' +'(' +')' +'[' +']' +'boolean' +'int' +'String' +'void' +'class' +'extends' +'main' +'public' +'static' +'return' +'while' +'if' +'else' +'=' +null +'!' +';' +'.' +',' +'true' +'false' +'this' +'new' +null +null +null +null +null + +token symbolic names: +null +null +null +INTEGER_LITERAL +LBrace +RBrace +LPran +RPran +LBrack +RBrack +BooleanType +IntegerType +StringType +VoidType +ClassSmt +ExtendsSmt +MainSmt +PublicSmt +StaticSmt +ReturnSmt +WhileSmt +IfSmt +ElseSmt +Equals +Operations +Exclamation +SemiColon +Dot +Comma +TRUE +FALSE +This +New +IDENTIFIER +Whitespace +BlockComment +LineComment +Newline + +rule names: +T__0 +T__1 +INTEGER_LITERAL +LBrace +RBrace +LPran +RPran +LBrack +RBrack +BooleanType +IntegerType +StringType +VoidType +ClassSmt +ExtendsSmt +MainSmt +PublicSmt +StaticSmt +ReturnSmt +WhileSmt +IfSmt +ElseSmt +Equals +Operations +Exclamation +SemiColon +Dot +Comma +TRUE +FALSE +This +New +IDENTIFIER +LETTER +DIGIT +Whitespace +BlockComment +LineComment +Newline + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 39, 291, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 6, 4, 109, 10, 4, 13, 4, 14, 4, 110, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 5, 25, 208, 10, 25, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 7, 34, 242, 10, 34, 12, 34, 14, 34, 245, 11, 34, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 6, 37, 252, 10, 37, 13, 37, 14, 37, 253, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 7, 38, 262, 10, 38, 12, 38, 14, 38, 265, 11, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 7, 39, 276, 10, 39, 12, 39, 14, 39, 279, 11, 39, 3, 39, 3, 39, 3, 40, 3, 40, 5, 40, 285, 10, 40, 3, 40, 5, 40, 288, 10, 40, 3, 40, 3, 40, 3, 263, 2, 41, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 2, 71, 2, 73, 36, 75, 37, 77, 38, 79, 39, 3, 2, 7, 5, 2, 44, 45, 47, 47, 62, 62, 4, 2, 67, 92, 99, 124, 3, 2, 50, 59, 4, 2, 11, 11, 34, 34, 4, 2, 12, 12, 15, 15, 2, 298, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 3, 81, 3, 2, 2, 2, 5, 100, 3, 2, 2, 2, 7, 108, 3, 2, 2, 2, 9, 112, 3, 2, 2, 2, 11, 114, 3, 2, 2, 2, 13, 116, 3, 2, 2, 2, 15, 118, 3, 2, 2, 2, 17, 120, 3, 2, 2, 2, 19, 122, 3, 2, 2, 2, 21, 124, 3, 2, 2, 2, 23, 132, 3, 2, 2, 2, 25, 136, 3, 2, 2, 2, 27, 143, 3, 2, 2, 2, 29, 148, 3, 2, 2, 2, 31, 154, 3, 2, 2, 2, 33, 162, 3, 2, 2, 2, 35, 167, 3, 2, 2, 2, 37, 174, 3, 2, 2, 2, 39, 181, 3, 2, 2, 2, 41, 188, 3, 2, 2, 2, 43, 194, 3, 2, 2, 2, 45, 197, 3, 2, 2, 2, 47, 202, 3, 2, 2, 2, 49, 207, 3, 2, 2, 2, 51, 209, 3, 2, 2, 2, 53, 211, 3, 2, 2, 2, 55, 213, 3, 2, 2, 2, 57, 215, 3, 2, 2, 2, 59, 217, 3, 2, 2, 2, 61, 222, 3, 2, 2, 2, 63, 228, 3, 2, 2, 2, 65, 233, 3, 2, 2, 2, 67, 237, 3, 2, 2, 2, 69, 246, 3, 2, 2, 2, 71, 248, 3, 2, 2, 2, 73, 251, 3, 2, 2, 2, 75, 257, 3, 2, 2, 2, 77, 271, 3, 2, 2, 2, 79, 287, 3, 2, 2, 2, 81, 82, 7, 85, 2, 2, 82, 83, 7, 123, 2, 2, 83, 84, 7, 117, 2, 2, 84, 85, 7, 118, 2, 2, 85, 86, 7, 103, 2, 2, 86, 87, 7, 111, 2, 2, 87, 88, 7, 48, 2, 2, 88, 89, 7, 113, 2, 2, 89, 90, 7, 119, 2, 2, 90, 91, 7, 118, 2, 2, 91, 92, 7, 48, 2, 2, 92, 93, 7, 114, 2, 2, 93, 94, 7, 116, 2, 2, 94, 95, 7, 107, 2, 2, 95, 96, 7, 112, 2, 2, 96, 97, 7, 118, 2, 2, 97, 98, 7, 110, 2, 2, 98, 99, 7, 112, 2, 2, 99, 4, 3, 2, 2, 2, 100, 101, 7, 110, 2, 2, 101, 102, 7, 103, 2, 2, 102, 103, 7, 112, 2, 2, 103, 104, 7, 105, 2, 2, 104, 105, 7, 118, 2, 2, 105, 106, 7, 106, 2, 2, 106, 6, 3, 2, 2, 2, 107, 109, 5, 71, 36, 2, 108, 107, 3, 2, 2, 2, 109, 110, 3, 2, 2, 2, 110, 108, 3, 2, 2, 2, 110, 111, 3, 2, 2, 2, 111, 8, 3, 2, 2, 2, 112, 113, 7, 125, 2, 2, 113, 10, 3, 2, 2, 2, 114, 115, 7, 127, 2, 2, 115, 12, 3, 2, 2, 2, 116, 117, 7, 42, 2, 2, 117, 14, 3, 2, 2, 2, 118, 119, 7, 43, 2, 2, 119, 16, 3, 2, 2, 2, 120, 121, 7, 93, 2, 2, 121, 18, 3, 2, 2, 2, 122, 123, 7, 95, 2, 2, 123, 20, 3, 2, 2, 2, 124, 125, 7, 100, 2, 2, 125, 126, 7, 113, 2, 2, 126, 127, 7, 113, 2, 2, 127, 128, 7, 110, 2, 2, 128, 129, 7, 103, 2, 2, 129, 130, 7, 99, 2, 2, 130, 131, 7, 112, 2, 2, 131, 22, 3, 2, 2, 2, 132, 133, 7, 107, 2, 2, 133, 134, 7, 112, 2, 2, 134, 135, 7, 118, 2, 2, 135, 24, 3, 2, 2, 2, 136, 137, 7, 85, 2, 2, 137, 138, 7, 118, 2, 2, 138, 139, 7, 116, 2, 2, 139, 140, 7, 107, 2, 2, 140, 141, 7, 112, 2, 2, 141, 142, 7, 105, 2, 2, 142, 26, 3, 2, 2, 2, 143, 144, 7, 120, 2, 2, 144, 145, 7, 113, 2, 2, 145, 146, 7, 107, 2, 2, 146, 147, 7, 102, 2, 2, 147, 28, 3, 2, 2, 2, 148, 149, 7, 101, 2, 2, 149, 150, 7, 110, 2, 2, 150, 151, 7, 99, 2, 2, 151, 152, 7, 117, 2, 2, 152, 153, 7, 117, 2, 2, 153, 30, 3, 2, 2, 2, 154, 155, 7, 103, 2, 2, 155, 156, 7, 122, 2, 2, 156, 157, 7, 118, 2, 2, 157, 158, 7, 103, 2, 2, 158, 159, 7, 112, 2, 2, 159, 160, 7, 102, 2, 2, 160, 161, 7, 117, 2, 2, 161, 32, 3, 2, 2, 2, 162, 163, 7, 111, 2, 2, 163, 164, 7, 99, 2, 2, 164, 165, 7, 107, 2, 2, 165, 166, 7, 112, 2, 2, 166, 34, 3, 2, 2, 2, 167, 168, 7, 114, 2, 2, 168, 169, 7, 119, 2, 2, 169, 170, 7, 100, 2, 2, 170, 171, 7, 110, 2, 2, 171, 172, 7, 107, 2, 2, 172, 173, 7, 101, 2, 2, 173, 36, 3, 2, 2, 2, 174, 175, 7, 117, 2, 2, 175, 176, 7, 118, 2, 2, 176, 177, 7, 99, 2, 2, 177, 178, 7, 118, 2, 2, 178, 179, 7, 107, 2, 2, 179, 180, 7, 101, 2, 2, 180, 38, 3, 2, 2, 2, 181, 182, 7, 116, 2, 2, 182, 183, 7, 103, 2, 2, 183, 184, 7, 118, 2, 2, 184, 185, 7, 119, 2, 2, 185, 186, 7, 116, 2, 2, 186, 187, 7, 112, 2, 2, 187, 40, 3, 2, 2, 2, 188, 189, 7, 121, 2, 2, 189, 190, 7, 106, 2, 2, 190, 191, 7, 107, 2, 2, 191, 192, 7, 110, 2, 2, 192, 193, 7, 103, 2, 2, 193, 42, 3, 2, 2, 2, 194, 195, 7, 107, 2, 2, 195, 196, 7, 104, 2, 2, 196, 44, 3, 2, 2, 2, 197, 198, 7, 103, 2, 2, 198, 199, 7, 110, 2, 2, 199, 200, 7, 117, 2, 2, 200, 201, 7, 103, 2, 2, 201, 46, 3, 2, 2, 2, 202, 203, 7, 63, 2, 2, 203, 48, 3, 2, 2, 2, 204, 205, 7, 40, 2, 2, 205, 208, 7, 40, 2, 2, 206, 208, 9, 2, 2, 2, 207, 204, 3, 2, 2, 2, 207, 206, 3, 2, 2, 2, 208, 50, 3, 2, 2, 2, 209, 210, 7, 35, 2, 2, 210, 52, 3, 2, 2, 2, 211, 212, 7, 61, 2, 2, 212, 54, 3, 2, 2, 2, 213, 214, 7, 48, 2, 2, 214, 56, 3, 2, 2, 2, 215, 216, 7, 46, 2, 2, 216, 58, 3, 2, 2, 2, 217, 218, 7, 118, 2, 2, 218, 219, 7, 116, 2, 2, 219, 220, 7, 119, 2, 2, 220, 221, 7, 103, 2, 2, 221, 60, 3, 2, 2, 2, 222, 223, 7, 104, 2, 2, 223, 224, 7, 99, 2, 2, 224, 225, 7, 110, 2, 2, 225, 226, 7, 117, 2, 2, 226, 227, 7, 103, 2, 2, 227, 62, 3, 2, 2, 2, 228, 229, 7, 118, 2, 2, 229, 230, 7, 106, 2, 2, 230, 231, 7, 107, 2, 2, 231, 232, 7, 117, 2, 2, 232, 64, 3, 2, 2, 2, 233, 234, 7, 112, 2, 2, 234, 235, 7, 103, 2, 2, 235, 236, 7, 121, 2, 2, 236, 66, 3, 2, 2, 2, 237, 243, 5, 69, 35, 2, 238, 242, 5, 69, 35, 2, 239, 242, 7, 97, 2, 2, 240, 242, 5, 71, 36, 2, 241, 238, 3, 2, 2, 2, 241, 239, 3, 2, 2, 2, 241, 240, 3, 2, 2, 2, 242, 245, 3, 2, 2, 2, 243, 241, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 68, 3, 2, 2, 2, 245, 243, 3, 2, 2, 2, 246, 247, 9, 3, 2, 2, 247, 70, 3, 2, 2, 2, 248, 249, 9, 4, 2, 2, 249, 72, 3, 2, 2, 2, 250, 252, 9, 5, 2, 2, 251, 250, 3, 2, 2, 2, 252, 253, 3, 2, 2, 2, 253, 251, 3, 2, 2, 2, 253, 254, 3, 2, 2, 2, 254, 255, 3, 2, 2, 2, 255, 256, 8, 37, 2, 2, 256, 74, 3, 2, 2, 2, 257, 258, 7, 49, 2, 2, 258, 259, 7, 44, 2, 2, 259, 263, 3, 2, 2, 2, 260, 262, 11, 2, 2, 2, 261, 260, 3, 2, 2, 2, 262, 265, 3, 2, 2, 2, 263, 264, 3, 2, 2, 2, 263, 261, 3, 2, 2, 2, 264, 266, 3, 2, 2, 2, 265, 263, 3, 2, 2, 2, 266, 267, 7, 44, 2, 2, 267, 268, 7, 49, 2, 2, 268, 269, 3, 2, 2, 2, 269, 270, 8, 38, 2, 2, 270, 76, 3, 2, 2, 2, 271, 272, 7, 49, 2, 2, 272, 273, 7, 49, 2, 2, 273, 277, 3, 2, 2, 2, 274, 276, 10, 6, 2, 2, 275, 274, 3, 2, 2, 2, 276, 279, 3, 2, 2, 2, 277, 275, 3, 2, 2, 2, 277, 278, 3, 2, 2, 2, 278, 280, 3, 2, 2, 2, 279, 277, 3, 2, 2, 2, 280, 281, 8, 39, 2, 2, 281, 78, 3, 2, 2, 2, 282, 284, 7, 15, 2, 2, 283, 285, 7, 12, 2, 2, 284, 283, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 288, 3, 2, 2, 2, 286, 288, 7, 12, 2, 2, 287, 282, 3, 2, 2, 2, 287, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 290, 8, 40, 2, 2, 290, 80, 3, 2, 2, 2, 12, 2, 110, 207, 241, 243, 253, 263, 277, 284, 287, 3, 8, 2, 2] \ No newline at end of file diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Lexer.py b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Lexer.py new file mode 100644 index 0000000..a13f0a8 --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Lexer.py @@ -0,0 +1,214 @@ +# Generated from Q3.g4 by ANTLR 4.9 +from antlr4 import * +from io import StringIO +from typing.io import TextIO +import sys + + + +def serializedATN(): + with StringIO() as buf: + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\'") + buf.write("\u0123\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") + buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r") + buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") + buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") + buf.write("\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36") + buf.write("\t\36\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%") + buf.write("\4&\t&\4\'\t\'\4(\t(\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3") + buf.write("\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3") + buf.write("\3\3\3\3\3\3\3\3\3\4\6\4m\n\4\r\4\16\4n\3\5\3\5\3\6\3") + buf.write("\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\3\13\3\13\3\13\3\13") + buf.write("\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3") + buf.write("\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17") + buf.write("\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21") + buf.write("\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22") + buf.write("\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24") + buf.write("\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26") + buf.write("\3\26\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\31\3\31\3\31") + buf.write("\5\31\u00d0\n\31\3\32\3\32\3\33\3\33\3\34\3\34\3\35\3") + buf.write("\35\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37") + buf.write("\3\37\3 \3 \3 \3 \3 \3!\3!\3!\3!\3\"\3\"\3\"\3\"\7\"\u00f2") + buf.write("\n\"\f\"\16\"\u00f5\13\"\3#\3#\3$\3$\3%\6%\u00fc\n%\r") + buf.write("%\16%\u00fd\3%\3%\3&\3&\3&\3&\7&\u0106\n&\f&\16&\u0109") + buf.write("\13&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\7\'\u0114\n\'\f\'") + buf.write("\16\'\u0117\13\'\3\'\3\'\3(\3(\5(\u011d\n(\3(\5(\u0120") + buf.write("\n(\3(\3(\3\u0107\2)\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21") + buf.write("\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24") + buf.write("\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37") + buf.write("= ?!A\"C#E\2G\2I$K%M&O\'\3\2\7\5\2,-//>>\4\2C\\c|\3\2") + buf.write("\62;\4\2\13\13\"\"\4\2\f\f\17\17\2\u012a\2\3\3\2\2\2\2") + buf.write("\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3") + buf.write("\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2") + buf.write("\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2") + buf.write("\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3") + buf.write("\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61") + buf.write("\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2") + buf.write("\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3") + buf.write("\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\3Q") + buf.write("\3\2\2\2\5d\3\2\2\2\7l\3\2\2\2\tp\3\2\2\2\13r\3\2\2\2") + buf.write("\rt\3\2\2\2\17v\3\2\2\2\21x\3\2\2\2\23z\3\2\2\2\25|\3") + buf.write("\2\2\2\27\u0084\3\2\2\2\31\u0088\3\2\2\2\33\u008f\3\2") + buf.write("\2\2\35\u0094\3\2\2\2\37\u009a\3\2\2\2!\u00a2\3\2\2\2") + buf.write("#\u00a7\3\2\2\2%\u00ae\3\2\2\2\'\u00b5\3\2\2\2)\u00bc") + buf.write("\3\2\2\2+\u00c2\3\2\2\2-\u00c5\3\2\2\2/\u00ca\3\2\2\2") + buf.write("\61\u00cf\3\2\2\2\63\u00d1\3\2\2\2\65\u00d3\3\2\2\2\67") + buf.write("\u00d5\3\2\2\29\u00d7\3\2\2\2;\u00d9\3\2\2\2=\u00de\3") + buf.write("\2\2\2?\u00e4\3\2\2\2A\u00e9\3\2\2\2C\u00ed\3\2\2\2E\u00f6") + buf.write("\3\2\2\2G\u00f8\3\2\2\2I\u00fb\3\2\2\2K\u0101\3\2\2\2") + buf.write("M\u010f\3\2\2\2O\u011f\3\2\2\2QR\7U\2\2RS\7{\2\2ST\7u") + buf.write("\2\2TU\7v\2\2UV\7g\2\2VW\7o\2\2WX\7\60\2\2XY\7q\2\2YZ") + buf.write("\7w\2\2Z[\7v\2\2[\\\7\60\2\2\\]\7r\2\2]^\7t\2\2^_\7k\2") + buf.write("\2_`\7p\2\2`a\7v\2\2ab\7n\2\2bc\7p\2\2c\4\3\2\2\2de\7") + buf.write("n\2\2ef\7g\2\2fg\7p\2\2gh\7i\2\2hi\7v\2\2ij\7j\2\2j\6") + buf.write("\3\2\2\2km\5G$\2lk\3\2\2\2mn\3\2\2\2nl\3\2\2\2no\3\2\2") + buf.write("\2o\b\3\2\2\2pq\7}\2\2q\n\3\2\2\2rs\7\177\2\2s\f\3\2\2") + buf.write("\2tu\7*\2\2u\16\3\2\2\2vw\7+\2\2w\20\3\2\2\2xy\7]\2\2") + buf.write("y\22\3\2\2\2z{\7_\2\2{\24\3\2\2\2|}\7d\2\2}~\7q\2\2~\177") + buf.write("\7q\2\2\177\u0080\7n\2\2\u0080\u0081\7g\2\2\u0081\u0082") + buf.write("\7c\2\2\u0082\u0083\7p\2\2\u0083\26\3\2\2\2\u0084\u0085") + buf.write("\7k\2\2\u0085\u0086\7p\2\2\u0086\u0087\7v\2\2\u0087\30") + buf.write("\3\2\2\2\u0088\u0089\7U\2\2\u0089\u008a\7v\2\2\u008a\u008b") + buf.write("\7t\2\2\u008b\u008c\7k\2\2\u008c\u008d\7p\2\2\u008d\u008e") + buf.write("\7i\2\2\u008e\32\3\2\2\2\u008f\u0090\7x\2\2\u0090\u0091") + buf.write("\7q\2\2\u0091\u0092\7k\2\2\u0092\u0093\7f\2\2\u0093\34") + buf.write("\3\2\2\2\u0094\u0095\7e\2\2\u0095\u0096\7n\2\2\u0096\u0097") + buf.write("\7c\2\2\u0097\u0098\7u\2\2\u0098\u0099\7u\2\2\u0099\36") + buf.write("\3\2\2\2\u009a\u009b\7g\2\2\u009b\u009c\7z\2\2\u009c\u009d") + buf.write("\7v\2\2\u009d\u009e\7g\2\2\u009e\u009f\7p\2\2\u009f\u00a0") + buf.write("\7f\2\2\u00a0\u00a1\7u\2\2\u00a1 \3\2\2\2\u00a2\u00a3") + buf.write("\7o\2\2\u00a3\u00a4\7c\2\2\u00a4\u00a5\7k\2\2\u00a5\u00a6") + buf.write("\7p\2\2\u00a6\"\3\2\2\2\u00a7\u00a8\7r\2\2\u00a8\u00a9") + buf.write("\7w\2\2\u00a9\u00aa\7d\2\2\u00aa\u00ab\7n\2\2\u00ab\u00ac") + buf.write("\7k\2\2\u00ac\u00ad\7e\2\2\u00ad$\3\2\2\2\u00ae\u00af") + buf.write("\7u\2\2\u00af\u00b0\7v\2\2\u00b0\u00b1\7c\2\2\u00b1\u00b2") + buf.write("\7v\2\2\u00b2\u00b3\7k\2\2\u00b3\u00b4\7e\2\2\u00b4&\3") + buf.write("\2\2\2\u00b5\u00b6\7t\2\2\u00b6\u00b7\7g\2\2\u00b7\u00b8") + buf.write("\7v\2\2\u00b8\u00b9\7w\2\2\u00b9\u00ba\7t\2\2\u00ba\u00bb") + buf.write("\7p\2\2\u00bb(\3\2\2\2\u00bc\u00bd\7y\2\2\u00bd\u00be") + buf.write("\7j\2\2\u00be\u00bf\7k\2\2\u00bf\u00c0\7n\2\2\u00c0\u00c1") + buf.write("\7g\2\2\u00c1*\3\2\2\2\u00c2\u00c3\7k\2\2\u00c3\u00c4") + buf.write("\7h\2\2\u00c4,\3\2\2\2\u00c5\u00c6\7g\2\2\u00c6\u00c7") + buf.write("\7n\2\2\u00c7\u00c8\7u\2\2\u00c8\u00c9\7g\2\2\u00c9.\3") + buf.write("\2\2\2\u00ca\u00cb\7?\2\2\u00cb\60\3\2\2\2\u00cc\u00cd") + buf.write("\7(\2\2\u00cd\u00d0\7(\2\2\u00ce\u00d0\t\2\2\2\u00cf\u00cc") + buf.write("\3\2\2\2\u00cf\u00ce\3\2\2\2\u00d0\62\3\2\2\2\u00d1\u00d2") + buf.write("\7#\2\2\u00d2\64\3\2\2\2\u00d3\u00d4\7=\2\2\u00d4\66\3") + buf.write("\2\2\2\u00d5\u00d6\7\60\2\2\u00d68\3\2\2\2\u00d7\u00d8") + buf.write("\7.\2\2\u00d8:\3\2\2\2\u00d9\u00da\7v\2\2\u00da\u00db") + buf.write("\7t\2\2\u00db\u00dc\7w\2\2\u00dc\u00dd\7g\2\2\u00dd<\3") + buf.write("\2\2\2\u00de\u00df\7h\2\2\u00df\u00e0\7c\2\2\u00e0\u00e1") + buf.write("\7n\2\2\u00e1\u00e2\7u\2\2\u00e2\u00e3\7g\2\2\u00e3>\3") + buf.write("\2\2\2\u00e4\u00e5\7v\2\2\u00e5\u00e6\7j\2\2\u00e6\u00e7") + buf.write("\7k\2\2\u00e7\u00e8\7u\2\2\u00e8@\3\2\2\2\u00e9\u00ea") + buf.write("\7p\2\2\u00ea\u00eb\7g\2\2\u00eb\u00ec\7y\2\2\u00ecB\3") + buf.write("\2\2\2\u00ed\u00f3\5E#\2\u00ee\u00f2\5E#\2\u00ef\u00f2") + buf.write("\7a\2\2\u00f0\u00f2\5G$\2\u00f1\u00ee\3\2\2\2\u00f1\u00ef") + buf.write("\3\2\2\2\u00f1\u00f0\3\2\2\2\u00f2\u00f5\3\2\2\2\u00f3") + buf.write("\u00f1\3\2\2\2\u00f3\u00f4\3\2\2\2\u00f4D\3\2\2\2\u00f5") + buf.write("\u00f3\3\2\2\2\u00f6\u00f7\t\3\2\2\u00f7F\3\2\2\2\u00f8") + buf.write("\u00f9\t\4\2\2\u00f9H\3\2\2\2\u00fa\u00fc\t\5\2\2\u00fb") + buf.write("\u00fa\3\2\2\2\u00fc\u00fd\3\2\2\2\u00fd\u00fb\3\2\2\2") + buf.write("\u00fd\u00fe\3\2\2\2\u00fe\u00ff\3\2\2\2\u00ff\u0100\b") + buf.write("%\2\2\u0100J\3\2\2\2\u0101\u0102\7\61\2\2\u0102\u0103") + buf.write("\7,\2\2\u0103\u0107\3\2\2\2\u0104\u0106\13\2\2\2\u0105") + buf.write("\u0104\3\2\2\2\u0106\u0109\3\2\2\2\u0107\u0108\3\2\2\2") + buf.write("\u0107\u0105\3\2\2\2\u0108\u010a\3\2\2\2\u0109\u0107\3") + buf.write("\2\2\2\u010a\u010b\7,\2\2\u010b\u010c\7\61\2\2\u010c\u010d") + buf.write("\3\2\2\2\u010d\u010e\b&\2\2\u010eL\3\2\2\2\u010f\u0110") + buf.write("\7\61\2\2\u0110\u0111\7\61\2\2\u0111\u0115\3\2\2\2\u0112") + buf.write("\u0114\n\6\2\2\u0113\u0112\3\2\2\2\u0114\u0117\3\2\2\2") + buf.write("\u0115\u0113\3\2\2\2\u0115\u0116\3\2\2\2\u0116\u0118\3") + buf.write("\2\2\2\u0117\u0115\3\2\2\2\u0118\u0119\b\'\2\2\u0119N") + buf.write("\3\2\2\2\u011a\u011c\7\17\2\2\u011b\u011d\7\f\2\2\u011c") + buf.write("\u011b\3\2\2\2\u011c\u011d\3\2\2\2\u011d\u0120\3\2\2\2") + buf.write("\u011e\u0120\7\f\2\2\u011f\u011a\3\2\2\2\u011f\u011e\3") + buf.write("\2\2\2\u0120\u0121\3\2\2\2\u0121\u0122\b(\2\2\u0122P\3") + buf.write("\2\2\2\f\2n\u00cf\u00f1\u00f3\u00fd\u0107\u0115\u011c") + buf.write("\u011f\3\b\2\2") + return buf.getvalue() + + +class Q3Lexer(Lexer): + + atn = ATNDeserializer().deserialize(serializedATN()) + + decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] + + T__0 = 1 + T__1 = 2 + INTEGER_LITERAL = 3 + LBrace = 4 + RBrace = 5 + LPran = 6 + RPran = 7 + LBrack = 8 + RBrack = 9 + BooleanType = 10 + IntegerType = 11 + StringType = 12 + VoidType = 13 + ClassSmt = 14 + ExtendsSmt = 15 + MainSmt = 16 + PublicSmt = 17 + StaticSmt = 18 + ReturnSmt = 19 + WhileSmt = 20 + IfSmt = 21 + ElseSmt = 22 + Equals = 23 + Operations = 24 + Exclamation = 25 + SemiColon = 26 + Dot = 27 + Comma = 28 + TRUE = 29 + FALSE = 30 + This = 31 + New = 32 + IDENTIFIER = 33 + Whitespace = 34 + BlockComment = 35 + LineComment = 36 + Newline = 37 + + channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] + + modeNames = [ "DEFAULT_MODE" ] + + literalNames = [ "", + "'System.out.println'", "'length'", "'{'", "'}'", "'('", "')'", + "'['", "']'", "'boolean'", "'int'", "'String'", "'void'", "'class'", + "'extends'", "'main'", "'public'", "'static'", "'return'", "'while'", + "'if'", "'else'", "'='", "'!'", "';'", "'.'", "','", "'true'", + "'false'", "'this'", "'new'" ] + + symbolicNames = [ "", + "INTEGER_LITERAL", "LBrace", "RBrace", "LPran", "RPran", "LBrack", + "RBrack", "BooleanType", "IntegerType", "StringType", "VoidType", + "ClassSmt", "ExtendsSmt", "MainSmt", "PublicSmt", "StaticSmt", + "ReturnSmt", "WhileSmt", "IfSmt", "ElseSmt", "Equals", "Operations", + "Exclamation", "SemiColon", "Dot", "Comma", "TRUE", "FALSE", + "This", "New", "IDENTIFIER", "Whitespace", "BlockComment", "LineComment", + "Newline" ] + + ruleNames = [ "T__0", "T__1", "INTEGER_LITERAL", "LBrace", "RBrace", + "LPran", "RPran", "LBrack", "RBrack", "BooleanType", "IntegerType", + "StringType", "VoidType", "ClassSmt", "ExtendsSmt", "MainSmt", + "PublicSmt", "StaticSmt", "ReturnSmt", "WhileSmt", "IfSmt", + "ElseSmt", "Equals", "Operations", "Exclamation", "SemiColon", + "Dot", "Comma", "TRUE", "FALSE", "This", "New", "IDENTIFIER", + "LETTER", "DIGIT", "Whitespace", "BlockComment", "LineComment", + "Newline" ] + + grammarFileName = "Q3.g4" + + def __init__(self, input=None, output:TextIO = sys.stdout): + super().__init__(input, output) + self.checkVersion("4.9") + self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache()) + self._actions = None + self._predicates = None + + diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Lexer.tokens b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Lexer.tokens new file mode 100644 index 0000000..e11438b --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Lexer.tokens @@ -0,0 +1,67 @@ +T__0=1 +T__1=2 +INTEGER_LITERAL=3 +LBrace=4 +RBrace=5 +LPran=6 +RPran=7 +LBrack=8 +RBrack=9 +BooleanType=10 +IntegerType=11 +StringType=12 +VoidType=13 +ClassSmt=14 +ExtendsSmt=15 +MainSmt=16 +PublicSmt=17 +StaticSmt=18 +ReturnSmt=19 +WhileSmt=20 +IfSmt=21 +ElseSmt=22 +Equals=23 +Operations=24 +Exclamation=25 +SemiColon=26 +Dot=27 +Comma=28 +TRUE=29 +FALSE=30 +This=31 +New=32 +IDENTIFIER=33 +Whitespace=34 +BlockComment=35 +LineComment=36 +Newline=37 +'System.out.println'=1 +'length'=2 +'{'=4 +'}'=5 +'('=6 +')'=7 +'['=8 +']'=9 +'boolean'=10 +'int'=11 +'String'=12 +'void'=13 +'class'=14 +'extends'=15 +'main'=16 +'public'=17 +'static'=18 +'return'=19 +'while'=20 +'if'=21 +'else'=22 +'='=23 +'!'=25 +';'=26 +'.'=27 +','=28 +'true'=29 +'false'=30 +'this'=31 +'new'=32 diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Listener.py b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Listener.py new file mode 100644 index 0000000..2819493 --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Listener.py @@ -0,0 +1,138 @@ +# Generated from Q3.g4 by ANTLR 4.9 +from antlr4 import * +if __name__ is not None and "." in __name__: + from .Q3Parser import Q3Parser +else: + from Q3Parser import Q3Parser + +# This class defines a complete listener for a parse tree produced by Q3Parser. +class Q3Listener(ParseTreeListener): + + # Enter a parse tree produced by Q3Parser#program. + def enterProgram(self, ctx:Q3Parser.ProgramContext): + pass + + # Exit a parse tree produced by Q3Parser#program. + def exitProgram(self, ctx:Q3Parser.ProgramContext): + pass + + + # Enter a parse tree produced by Q3Parser#mainClass. + def enterMainClass(self, ctx:Q3Parser.MainClassContext): + pass + + # Exit a parse tree produced by Q3Parser#mainClass. + def exitMainClass(self, ctx:Q3Parser.MainClassContext): + pass + + + # Enter a parse tree produced by Q3Parser#mainDefinition. + def enterMainDefinition(self, ctx:Q3Parser.MainDefinitionContext): + pass + + # Exit a parse tree produced by Q3Parser#mainDefinition. + def exitMainDefinition(self, ctx:Q3Parser.MainDefinitionContext): + pass + + + # Enter a parse tree produced by Q3Parser#classDeclaration. + def enterClassDeclaration(self, ctx:Q3Parser.ClassDeclarationContext): + pass + + # Exit a parse tree produced by Q3Parser#classDeclaration. + def exitClassDeclaration(self, ctx:Q3Parser.ClassDeclarationContext): + pass + + + # Enter a parse tree produced by Q3Parser#methodDeclaration. + def enterMethodDeclaration(self, ctx:Q3Parser.MethodDeclarationContext): + pass + + # Exit a parse tree produced by Q3Parser#methodDeclaration. + def exitMethodDeclaration(self, ctx:Q3Parser.MethodDeclarationContext): + pass + + + # Enter a parse tree produced by Q3Parser#methodName. + def enterMethodName(self, ctx:Q3Parser.MethodNameContext): + pass + + # Exit a parse tree produced by Q3Parser#methodName. + def exitMethodName(self, ctx:Q3Parser.MethodNameContext): + pass + + + # Enter a parse tree produced by Q3Parser#methodDefinition. + def enterMethodDefinition(self, ctx:Q3Parser.MethodDefinitionContext): + pass + + # Exit a parse tree produced by Q3Parser#methodDefinition. + def exitMethodDefinition(self, ctx:Q3Parser.MethodDefinitionContext): + pass + + + # Enter a parse tree produced by Q3Parser#varDeclaration. + def enterVarDeclaration(self, ctx:Q3Parser.VarDeclarationContext): + pass + + # Exit a parse tree produced by Q3Parser#varDeclaration. + def exitVarDeclaration(self, ctx:Q3Parser.VarDeclarationContext): + pass + + + # Enter a parse tree produced by Q3Parser#methodParam. + def enterMethodParam(self, ctx:Q3Parser.MethodParamContext): + pass + + # Exit a parse tree produced by Q3Parser#methodParam. + def exitMethodParam(self, ctx:Q3Parser.MethodParamContext): + pass + + + # Enter a parse tree produced by Q3Parser#type. + def enterType(self, ctx:Q3Parser.TypeContext): + pass + + # Exit a parse tree produced by Q3Parser#type. + def exitType(self, ctx:Q3Parser.TypeContext): + pass + + + # Enter a parse tree produced by Q3Parser#statement. + def enterStatement(self, ctx:Q3Parser.StatementContext): + pass + + # Exit a parse tree produced by Q3Parser#statement. + def exitStatement(self, ctx:Q3Parser.StatementContext): + pass + + + # Enter a parse tree produced by Q3Parser#expression. + def enterExpression(self, ctx:Q3Parser.ExpressionContext): + pass + + # Exit a parse tree produced by Q3Parser#expression. + def exitExpression(self, ctx:Q3Parser.ExpressionContext): + pass + + + # Enter a parse tree produced by Q3Parser#functionParams. + def enterFunctionParams(self, ctx:Q3Parser.FunctionParamsContext): + pass + + # Exit a parse tree produced by Q3Parser#functionParams. + def exitFunctionParams(self, ctx:Q3Parser.FunctionParamsContext): + pass + + + # Enter a parse tree produced by Q3Parser#identifier. + def enterIdentifier(self, ctx:Q3Parser.IdentifierContext): + pass + + # Exit a parse tree produced by Q3Parser#identifier. + def exitIdentifier(self, ctx:Q3Parser.IdentifierContext): + pass + + + +del Q3Parser \ No newline at end of file diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Parser.py b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Parser.py new file mode 100644 index 0000000..73f14e4 --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Parser.py @@ -0,0 +1,1749 @@ +# Generated from Q3.g4 by ANTLR 4.9 +# encoding: utf-8 +from antlr4 import * +from io import StringIO +import sys +if sys.version_info[1] > 5: + from typing import TextIO +else: + from typing.io import TextIO + + +def serializedATN(): + with StringIO() as buf: + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\'") + buf.write("\u010e\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16") + buf.write("\t\16\4\17\t\17\3\2\3\2\7\2!\n\2\f\2\16\2$\13\2\3\2\3") + buf.write("\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3") + buf.write("\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\5") + buf.write("\5B\n\5\3\5\3\5\7\5F\n\5\f\5\16\5I\13\5\3\5\7\5L\n\5\f") + buf.write("\5\16\5O\13\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\7\6Y\n\6") + buf.write("\f\6\16\6\\\13\6\5\6^\n\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7") + buf.write("\3\7\3\b\3\b\7\bj\n\b\f\b\16\bm\13\b\3\b\7\bp\n\b\f\b") + buf.write("\16\bs\13\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3") + buf.write("\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\5\13") + buf.write("\u008a\n\13\3\f\3\f\7\f\u008e\n\f\f\f\16\f\u0091\13\f") + buf.write("\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3") + buf.write("\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f") + buf.write("\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3") + buf.write("\f\3\f\3\f\5\f\u00be\n\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3") + buf.write("\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r") + buf.write("\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\5") + buf.write("\r\u00e2\n\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3") + buf.write("\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\7\r\u00fa") + buf.write("\n\r\f\r\16\r\u00fd\13\r\5\r\u00ff\n\r\3\r\3\r\3\r\7\r") + buf.write("\u0104\n\r\f\r\16\r\u0107\13\r\3\16\3\16\3\16\3\17\3\17") + buf.write("\3\17\2\3\30\20\2\4\6\b\n\f\16\20\22\24\26\30\32\34\2") + buf.write("\2\2\u011e\2\36\3\2\2\2\4\'\3\2\2\2\6\67\3\2\2\2\b=\3") + buf.write("\2\2\2\nR\3\2\2\2\fb\3\2\2\2\16g\3\2\2\2\20z\3\2\2\2\22") + buf.write("\177\3\2\2\2\24\u0089\3\2\2\2\26\u00bd\3\2\2\2\30\u00e1") + buf.write("\3\2\2\2\32\u0108\3\2\2\2\34\u010b\3\2\2\2\36\"\5\4\3") + buf.write("\2\37!\5\b\5\2 \37\3\2\2\2!$\3\2\2\2\" \3\2\2\2\"#\3\2") + buf.write("\2\2#%\3\2\2\2$\"\3\2\2\2%&\7\2\2\3&\3\3\2\2\2\'(\b\3") + buf.write("\1\2()\7\20\2\2)*\5\34\17\2*+\7\6\2\2+,\7\23\2\2,-\7\24") + buf.write("\2\2-.\7\17\2\2./\7\22\2\2/\60\7\b\2\2\60\61\7\16\2\2") + buf.write("\61\62\7\n\2\2\62\63\7\13\2\2\63\64\5\34\17\2\64\65\7") + buf.write("\t\2\2\65\66\5\6\4\2\66\5\3\2\2\2\678\7\6\2\289\5\26\f") + buf.write("\29:\7\7\2\2:;\7\7\2\2;<\b\4\1\2<\7\3\2\2\2=>\7\20\2\2") + buf.write(">A\5\34\17\2?@\7\21\2\2@B\5\34\17\2A?\3\2\2\2AB\3\2\2") + buf.write("\2BC\3\2\2\2CG\7\6\2\2DF\5\20\t\2ED\3\2\2\2FI\3\2\2\2") + buf.write("GE\3\2\2\2GH\3\2\2\2HM\3\2\2\2IG\3\2\2\2JL\5\n\6\2KJ\3") + buf.write("\2\2\2LO\3\2\2\2MK\3\2\2\2MN\3\2\2\2NP\3\2\2\2OM\3\2\2") + buf.write("\2PQ\7\7\2\2Q\t\3\2\2\2RS\b\6\1\2ST\5\f\7\2T]\7\b\2\2") + buf.write("UZ\5\22\n\2VW\7\36\2\2WY\5\22\n\2XV\3\2\2\2Y\\\3\2\2\2") + buf.write("ZX\3\2\2\2Z[\3\2\2\2[^\3\2\2\2\\Z\3\2\2\2]U\3\2\2\2]^") + buf.write("\3\2\2\2^_\3\2\2\2_`\7\t\2\2`a\5\16\b\2a\13\3\2\2\2bc") + buf.write("\7\23\2\2cd\5\24\13\2de\5\34\17\2ef\b\7\1\2f\r\3\2\2\2") + buf.write("gk\7\6\2\2hj\5\20\t\2ih\3\2\2\2jm\3\2\2\2ki\3\2\2\2kl") + buf.write("\3\2\2\2lq\3\2\2\2mk\3\2\2\2np\5\26\f\2on\3\2\2\2ps\3") + buf.write("\2\2\2qo\3\2\2\2qr\3\2\2\2rt\3\2\2\2sq\3\2\2\2tu\7\25") + buf.write("\2\2uv\5\30\r\2vw\7\34\2\2wx\7\7\2\2xy\b\b\1\2y\17\3\2") + buf.write("\2\2z{\5\24\13\2{|\5\34\17\2|}\7\34\2\2}~\b\t\1\2~\21") + buf.write("\3\2\2\2\177\u0080\5\24\13\2\u0080\u0081\5\34\17\2\u0081") + buf.write("\u0082\b\n\1\2\u0082\23\3\2\2\2\u0083\u0084\7\r\2\2\u0084") + buf.write("\u0085\7\n\2\2\u0085\u008a\7\13\2\2\u0086\u008a\7\f\2") + buf.write("\2\u0087\u008a\7\r\2\2\u0088\u008a\5\34\17\2\u0089\u0083") + buf.write("\3\2\2\2\u0089\u0086\3\2\2\2\u0089\u0087\3\2\2\2\u0089") + buf.write("\u0088\3\2\2\2\u008a\25\3\2\2\2\u008b\u008f\7\6\2\2\u008c") + buf.write("\u008e\5\26\f\2\u008d\u008c\3\2\2\2\u008e\u0091\3\2\2") + buf.write("\2\u008f\u008d\3\2\2\2\u008f\u0090\3\2\2\2\u0090\u0092") + buf.write("\3\2\2\2\u0091\u008f\3\2\2\2\u0092\u00be\7\7\2\2\u0093") + buf.write("\u0094\7\27\2\2\u0094\u0095\7\b\2\2\u0095\u0096\5\30\r") + buf.write("\2\u0096\u0097\7\t\2\2\u0097\u0098\b\f\1\2\u0098\u0099") + buf.write("\5\26\f\2\u0099\u009a\b\f\1\2\u009a\u009b\7\30\2\2\u009b") + buf.write("\u009c\5\26\f\2\u009c\u009d\b\f\1\2\u009d\u00be\3\2\2") + buf.write("\2\u009e\u009f\b\f\1\2\u009f\u00a0\7\26\2\2\u00a0\u00a1") + buf.write("\7\b\2\2\u00a1\u00a2\5\30\r\2\u00a2\u00a3\7\t\2\2\u00a3") + buf.write("\u00a4\b\f\1\2\u00a4\u00a5\5\26\f\2\u00a5\u00a6\b\f\1") + buf.write("\2\u00a6\u00be\3\2\2\2\u00a7\u00a8\7\3\2\2\u00a8\u00a9") + buf.write("\7\b\2\2\u00a9\u00aa\5\30\r\2\u00aa\u00ab\7\t\2\2\u00ab") + buf.write("\u00ac\7\34\2\2\u00ac\u00ad\b\f\1\2\u00ad\u00be\3\2\2") + buf.write("\2\u00ae\u00af\5\34\17\2\u00af\u00b0\7\31\2\2\u00b0\u00b1") + buf.write("\5\30\r\2\u00b1\u00b2\7\34\2\2\u00b2\u00b3\b\f\1\2\u00b3") + buf.write("\u00be\3\2\2\2\u00b4\u00b5\5\34\17\2\u00b5\u00b6\7\n\2") + buf.write("\2\u00b6\u00b7\5\30\r\2\u00b7\u00b8\7\13\2\2\u00b8\u00b9") + buf.write("\7\31\2\2\u00b9\u00ba\5\30\r\2\u00ba\u00bb\7\34\2\2\u00bb") + buf.write("\u00bc\b\f\1\2\u00bc\u00be\3\2\2\2\u00bd\u008b\3\2\2\2") + buf.write("\u00bd\u0093\3\2\2\2\u00bd\u009e\3\2\2\2\u00bd\u00a7\3") + buf.write("\2\2\2\u00bd\u00ae\3\2\2\2\u00bd\u00b4\3\2\2\2\u00be\27") + buf.write("\3\2\2\2\u00bf\u00c0\b\r\1\2\u00c0\u00c1\7\5\2\2\u00c1") + buf.write("\u00e2\b\r\1\2\u00c2\u00c3\7\37\2\2\u00c3\u00e2\b\r\1") + buf.write("\2\u00c4\u00c5\7 \2\2\u00c5\u00e2\b\r\1\2\u00c6\u00c7") + buf.write("\5\34\17\2\u00c7\u00c8\b\r\1\2\u00c8\u00e2\3\2\2\2\u00c9") + buf.write("\u00ca\7!\2\2\u00ca\u00e2\b\r\1\2\u00cb\u00cc\7\"\2\2") + buf.write("\u00cc\u00cd\7\r\2\2\u00cd\u00ce\7\n\2\2\u00ce\u00cf\5") + buf.write("\30\r\2\u00cf\u00d0\7\13\2\2\u00d0\u00d1\b\r\1\2\u00d1") + buf.write("\u00e2\3\2\2\2\u00d2\u00d3\7\"\2\2\u00d3\u00d4\5\34\17") + buf.write("\2\u00d4\u00d5\7\b\2\2\u00d5\u00d6\7\t\2\2\u00d6\u00d7") + buf.write("\b\r\1\2\u00d7\u00e2\3\2\2\2\u00d8\u00d9\7\33\2\2\u00d9") + buf.write("\u00da\5\30\r\4\u00da\u00db\b\r\1\2\u00db\u00e2\3\2\2") + buf.write("\2\u00dc\u00dd\7\b\2\2\u00dd\u00de\5\30\r\2\u00de\u00df") + buf.write("\7\t\2\2\u00df\u00e0\b\r\1\2\u00e0\u00e2\3\2\2\2\u00e1") + buf.write("\u00bf\3\2\2\2\u00e1\u00c2\3\2\2\2\u00e1\u00c4\3\2\2\2") + buf.write("\u00e1\u00c6\3\2\2\2\u00e1\u00c9\3\2\2\2\u00e1\u00cb\3") + buf.write("\2\2\2\u00e1\u00d2\3\2\2\2\u00e1\u00d8\3\2\2\2\u00e1\u00dc") + buf.write("\3\2\2\2\u00e2\u0105\3\2\2\2\u00e3\u00e4\f\17\2\2\u00e4") + buf.write("\u00e5\7\32\2\2\u00e5\u00e6\5\30\r\20\u00e6\u00e7\b\r") + buf.write("\1\2\u00e7\u0104\3\2\2\2\u00e8\u00e9\f\16\2\2\u00e9\u00ea") + buf.write("\7\n\2\2\u00ea\u00eb\5\30\r\2\u00eb\u00ec\7\13\2\2\u00ec") + buf.write("\u00ed\b\r\1\2\u00ed\u0104\3\2\2\2\u00ee\u00ef\f\r\2\2") + buf.write("\u00ef\u00f0\7\35\2\2\u00f0\u00f1\7\4\2\2\u00f1\u0104") + buf.write("\b\r\1\2\u00f2\u00f3\f\f\2\2\u00f3\u00f4\7\35\2\2\u00f4") + buf.write("\u00f5\5\34\17\2\u00f5\u00fe\7\b\2\2\u00f6\u00fb\5\32") + buf.write("\16\2\u00f7\u00f8\7\36\2\2\u00f8\u00fa\5\32\16\2\u00f9") + buf.write("\u00f7\3\2\2\2\u00fa\u00fd\3\2\2\2\u00fb\u00f9\3\2\2\2") + buf.write("\u00fb\u00fc\3\2\2\2\u00fc\u00ff\3\2\2\2\u00fd\u00fb\3") + buf.write("\2\2\2\u00fe\u00f6\3\2\2\2\u00fe\u00ff\3\2\2\2\u00ff\u0100") + buf.write("\3\2\2\2\u0100\u0101\7\t\2\2\u0101\u0102\b\r\1\2\u0102") + buf.write("\u0104\3\2\2\2\u0103\u00e3\3\2\2\2\u0103\u00e8\3\2\2\2") + buf.write("\u0103\u00ee\3\2\2\2\u0103\u00f2\3\2\2\2\u0104\u0107\3") + buf.write("\2\2\2\u0105\u0103\3\2\2\2\u0105\u0106\3\2\2\2\u0106\31") + buf.write("\3\2\2\2\u0107\u0105\3\2\2\2\u0108\u0109\5\30\r\2\u0109") + buf.write("\u010a\b\16\1\2\u010a\33\3\2\2\2\u010b\u010c\7#\2\2\u010c") + buf.write("\35\3\2\2\2\22\"AGMZ]kq\u0089\u008f\u00bd\u00e1\u00fb") + buf.write("\u00fe\u0103\u0105") + return buf.getvalue() + + +class Q3Parser ( Parser ): + + grammarFileName = "Q3.g4" + + atn = ATNDeserializer().deserialize(serializedATN()) + + decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] + + sharedContextCache = PredictionContextCache() + + literalNames = [ "", "'System.out.println'", "'length'", "", + "'{'", "'}'", "'('", "')'", "'['", "']'", "'boolean'", + "'int'", "'String'", "'void'", "'class'", "'extends'", + "'main'", "'public'", "'static'", "'return'", "'while'", + "'if'", "'else'", "'='", "", "'!'", "';'", + "'.'", "','", "'true'", "'false'", "'this'", "'new'" ] + + symbolicNames = [ "", "", "", "INTEGER_LITERAL", + "LBrace", "RBrace", "LPran", "RPran", "LBrack", "RBrack", + "BooleanType", "IntegerType", "StringType", "VoidType", + "ClassSmt", "ExtendsSmt", "MainSmt", "PublicSmt", + "StaticSmt", "ReturnSmt", "WhileSmt", "IfSmt", "ElseSmt", + "Equals", "Operations", "Exclamation", "SemiColon", + "Dot", "Comma", "TRUE", "FALSE", "This", "New", "IDENTIFIER", + "Whitespace", "BlockComment", "LineComment", "Newline" ] + + RULE_program = 0 + RULE_mainClass = 1 + RULE_mainDefinition = 2 + RULE_classDeclaration = 3 + RULE_methodDeclaration = 4 + RULE_methodName = 5 + RULE_methodDefinition = 6 + RULE_varDeclaration = 7 + RULE_methodParam = 8 + RULE_type = 9 + RULE_statement = 10 + RULE_expression = 11 + RULE_functionParams = 12 + RULE_identifier = 13 + + ruleNames = [ "program", "mainClass", "mainDefinition", "classDeclaration", + "methodDeclaration", "methodName", "methodDefinition", + "varDeclaration", "methodParam", "type", "statement", + "expression", "functionParams", "identifier" ] + + EOF = Token.EOF + T__0=1 + T__1=2 + INTEGER_LITERAL=3 + LBrace=4 + RBrace=5 + LPran=6 + RPran=7 + LBrack=8 + RBrack=9 + BooleanType=10 + IntegerType=11 + StringType=12 + VoidType=13 + ClassSmt=14 + ExtendsSmt=15 + MainSmt=16 + PublicSmt=17 + StaticSmt=18 + ReturnSmt=19 + WhileSmt=20 + IfSmt=21 + ElseSmt=22 + Equals=23 + Operations=24 + Exclamation=25 + SemiColon=26 + Dot=27 + Comma=28 + TRUE=29 + FALSE=30 + This=31 + New=32 + IDENTIFIER=33 + Whitespace=34 + BlockComment=35 + LineComment=36 + Newline=37 + + def __init__(self, input:TokenStream, output:TextIO = sys.stdout): + super().__init__(input, output) + self.checkVersion("4.9") + self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) + self._predicates = None + + + + var_dict = {} + temp_counter = 0 + label_counter = 0 + params = 0 + current_function_params = 0 + + + method_body = "" + + def define_variable(self, type, name): + if name not in self.var_dict: + self.var_dict[name] = type + + def create_temp(self): + new_temp = f"_t{self.temp_counter}" + self.temp_counter += 1 + self.current_function_params += 1 + return new_temp + + def create_label(self): + new_label = f"L{self.label_counter}" + self.label_counter += 1 + return new_label + + def add_to_method_body(self, text): + self.method_body += text + "\n" + + def get_method_body(self): + return self.method_body + + def clear_method_body(self): + self.method_body = "" + + + + class ProgramContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def mainClass(self): + return self.getTypedRuleContext(Q3Parser.MainClassContext,0) + + + def EOF(self): + return self.getToken(Q3Parser.EOF, 0) + + def classDeclaration(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q3Parser.ClassDeclarationContext) + else: + return self.getTypedRuleContext(Q3Parser.ClassDeclarationContext,i) + + + def getRuleIndex(self): + return Q3Parser.RULE_program + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterProgram" ): + listener.enterProgram(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitProgram" ): + listener.exitProgram(self) + + + + + def program(self): + + localctx = Q3Parser.ProgramContext(self, self._ctx, self.state) + self.enterRule(localctx, 0, self.RULE_program) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 28 + self.mainClass() + self.state = 32 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==Q3Parser.ClassSmt: + self.state = 29 + self.classDeclaration() + self.state = 34 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 35 + self.match(Q3Parser.EOF) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MainClassContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def ClassSmt(self): + return self.getToken(Q3Parser.ClassSmt, 0) + + def identifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q3Parser.IdentifierContext) + else: + return self.getTypedRuleContext(Q3Parser.IdentifierContext,i) + + + def LBrace(self): + return self.getToken(Q3Parser.LBrace, 0) + + def PublicSmt(self): + return self.getToken(Q3Parser.PublicSmt, 0) + + def StaticSmt(self): + return self.getToken(Q3Parser.StaticSmt, 0) + + def VoidType(self): + return self.getToken(Q3Parser.VoidType, 0) + + def MainSmt(self): + return self.getToken(Q3Parser.MainSmt, 0) + + def LPran(self): + return self.getToken(Q3Parser.LPran, 0) + + def StringType(self): + return self.getToken(Q3Parser.StringType, 0) + + def LBrack(self): + return self.getToken(Q3Parser.LBrack, 0) + + def RBrack(self): + return self.getToken(Q3Parser.RBrack, 0) + + def RPran(self): + return self.getToken(Q3Parser.RPran, 0) + + def mainDefinition(self): + return self.getTypedRuleContext(Q3Parser.MainDefinitionContext,0) + + + def getRuleIndex(self): + return Q3Parser.RULE_mainClass + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMainClass" ): + listener.enterMainClass(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMainClass" ): + listener.exitMainClass(self) + + + + + def mainClass(self): + + localctx = Q3Parser.MainClassContext(self, self._ctx, self.state) + self.enterRule(localctx, 2, self.RULE_mainClass) + try: + self.enterOuterAlt(localctx, 1) + + print("main:") + self.params = 0 + self.current_function_params = 0 + + self.state = 38 + self.match(Q3Parser.ClassSmt) + self.state = 39 + self.identifier() + self.state = 40 + self.match(Q3Parser.LBrace) + self.state = 41 + self.match(Q3Parser.PublicSmt) + self.state = 42 + self.match(Q3Parser.StaticSmt) + self.state = 43 + self.match(Q3Parser.VoidType) + self.state = 44 + self.match(Q3Parser.MainSmt) + self.state = 45 + self.match(Q3Parser.LPran) + self.state = 46 + self.match(Q3Parser.StringType) + self.state = 47 + self.match(Q3Parser.LBrack) + self.state = 48 + self.match(Q3Parser.RBrack) + self.state = 49 + self.identifier() + self.state = 50 + self.match(Q3Parser.RPran) + self.state = 51 + self.mainDefinition() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MainDefinitionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def LBrace(self): + return self.getToken(Q3Parser.LBrace, 0) + + def statement(self): + return self.getTypedRuleContext(Q3Parser.StatementContext,0) + + + def RBrace(self, i:int=None): + if i is None: + return self.getTokens(Q3Parser.RBrace) + else: + return self.getToken(Q3Parser.RBrace, i) + + def getRuleIndex(self): + return Q3Parser.RULE_mainDefinition + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMainDefinition" ): + listener.enterMainDefinition(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMainDefinition" ): + listener.exitMainDefinition(self) + + + + + def mainDefinition(self): + + localctx = Q3Parser.MainDefinitionContext(self, self._ctx, self.state) + self.enterRule(localctx, 4, self.RULE_mainDefinition) + try: + self.enterOuterAlt(localctx, 1) + self.state = 53 + self.match(Q3Parser.LBrace) + self.state = 54 + self.statement() + self.state = 55 + self.match(Q3Parser.RBrace) + self.state = 56 + self.match(Q3Parser.RBrace) + + print(f"\tBeginFunc {self.current_function_params * 4}") + print(self.get_method_body()) + self.clear_method_body() + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ClassDeclarationContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def ClassSmt(self): + return self.getToken(Q3Parser.ClassSmt, 0) + + def identifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q3Parser.IdentifierContext) + else: + return self.getTypedRuleContext(Q3Parser.IdentifierContext,i) + + + def LBrace(self): + return self.getToken(Q3Parser.LBrace, 0) + + def RBrace(self): + return self.getToken(Q3Parser.RBrace, 0) + + def ExtendsSmt(self): + return self.getToken(Q3Parser.ExtendsSmt, 0) + + def varDeclaration(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q3Parser.VarDeclarationContext) + else: + return self.getTypedRuleContext(Q3Parser.VarDeclarationContext,i) + + + def methodDeclaration(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q3Parser.MethodDeclarationContext) + else: + return self.getTypedRuleContext(Q3Parser.MethodDeclarationContext,i) + + + def getRuleIndex(self): + return Q3Parser.RULE_classDeclaration + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterClassDeclaration" ): + listener.enterClassDeclaration(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitClassDeclaration" ): + listener.exitClassDeclaration(self) + + + + + def classDeclaration(self): + + localctx = Q3Parser.ClassDeclarationContext(self, self._ctx, self.state) + self.enterRule(localctx, 6, self.RULE_classDeclaration) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 59 + self.match(Q3Parser.ClassSmt) + self.state = 60 + self.identifier() + self.state = 63 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==Q3Parser.ExtendsSmt: + self.state = 61 + self.match(Q3Parser.ExtendsSmt) + self.state = 62 + self.identifier() + + + self.state = 65 + self.match(Q3Parser.LBrace) + self.state = 69 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << Q3Parser.BooleanType) | (1 << Q3Parser.IntegerType) | (1 << Q3Parser.IDENTIFIER))) != 0): + self.state = 66 + self.varDeclaration() + self.state = 71 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 75 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==Q3Parser.PublicSmt: + self.state = 72 + self.methodDeclaration() + self.state = 77 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 78 + self.match(Q3Parser.RBrace) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodDeclarationContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def methodName(self): + return self.getTypedRuleContext(Q3Parser.MethodNameContext,0) + + + def LPran(self): + return self.getToken(Q3Parser.LPran, 0) + + def RPran(self): + return self.getToken(Q3Parser.RPran, 0) + + def methodDefinition(self): + return self.getTypedRuleContext(Q3Parser.MethodDefinitionContext,0) + + + def methodParam(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q3Parser.MethodParamContext) + else: + return self.getTypedRuleContext(Q3Parser.MethodParamContext,i) + + + def Comma(self, i:int=None): + if i is None: + return self.getTokens(Q3Parser.Comma) + else: + return self.getToken(Q3Parser.Comma, i) + + def getRuleIndex(self): + return Q3Parser.RULE_methodDeclaration + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMethodDeclaration" ): + listener.enterMethodDeclaration(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMethodDeclaration" ): + listener.exitMethodDeclaration(self) + + + + + def methodDeclaration(self): + + localctx = Q3Parser.MethodDeclarationContext(self, self._ctx, self.state) + self.enterRule(localctx, 8, self.RULE_methodDeclaration) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + + self.params = 0 + self.current_function_params = 0 + + self.state = 81 + self.methodName() + self.state = 82 + self.match(Q3Parser.LPran) + self.state = 91 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << Q3Parser.BooleanType) | (1 << Q3Parser.IntegerType) | (1 << Q3Parser.IDENTIFIER))) != 0): + self.state = 83 + self.methodParam() + self.state = 88 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==Q3Parser.Comma: + self.state = 84 + self.match(Q3Parser.Comma) + self.state = 85 + self.methodParam() + self.state = 90 + self._errHandler.sync(self) + _la = self._input.LA(1) + + + + self.state = 93 + self.match(Q3Parser.RPran) + self.state = 94 + self.methodDefinition() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodNameContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.methodType = None # TypeContext + self.methodID = None # IdentifierContext + + def PublicSmt(self): + return self.getToken(Q3Parser.PublicSmt, 0) + + def type(self): + return self.getTypedRuleContext(Q3Parser.TypeContext,0) + + + def identifier(self): + return self.getTypedRuleContext(Q3Parser.IdentifierContext,0) + + + def getRuleIndex(self): + return Q3Parser.RULE_methodName + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMethodName" ): + listener.enterMethodName(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMethodName" ): + listener.exitMethodName(self) + + + + + def methodName(self): + + localctx = Q3Parser.MethodNameContext(self, self._ctx, self.state) + self.enterRule(localctx, 10, self.RULE_methodName) + try: + self.enterOuterAlt(localctx, 1) + self.state = 96 + self.match(Q3Parser.PublicSmt) + self.state = 97 + localctx.methodType = self.type() + self.state = 98 + localctx.methodID = self.identifier() + + print(f"{(None if localctx.methodID is None else self._input.getText(localctx.methodID.start,localctx.methodID.stop))}:") + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodDefinitionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.first = None # ExpressionContext + + def LBrace(self): + return self.getToken(Q3Parser.LBrace, 0) + + def ReturnSmt(self): + return self.getToken(Q3Parser.ReturnSmt, 0) + + def SemiColon(self): + return self.getToken(Q3Parser.SemiColon, 0) + + def RBrace(self): + return self.getToken(Q3Parser.RBrace, 0) + + def expression(self): + return self.getTypedRuleContext(Q3Parser.ExpressionContext,0) + + + def varDeclaration(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q3Parser.VarDeclarationContext) + else: + return self.getTypedRuleContext(Q3Parser.VarDeclarationContext,i) + + + def statement(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q3Parser.StatementContext) + else: + return self.getTypedRuleContext(Q3Parser.StatementContext,i) + + + def getRuleIndex(self): + return Q3Parser.RULE_methodDefinition + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMethodDefinition" ): + listener.enterMethodDefinition(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMethodDefinition" ): + listener.exitMethodDefinition(self) + + + + + def methodDefinition(self): + + localctx = Q3Parser.MethodDefinitionContext(self, self._ctx, self.state) + self.enterRule(localctx, 12, self.RULE_methodDefinition) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 101 + self.match(Q3Parser.LBrace) + self.state = 105 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,6,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 102 + self.varDeclaration() + self.state = 107 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,6,self._ctx) + + self.state = 111 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << Q3Parser.T__0) | (1 << Q3Parser.LBrace) | (1 << Q3Parser.WhileSmt) | (1 << Q3Parser.IfSmt) | (1 << Q3Parser.IDENTIFIER))) != 0): + self.state = 108 + self.statement() + self.state = 113 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 114 + self.match(Q3Parser.ReturnSmt) + self.state = 115 + localctx.first = self.expression(0) + self.state = 116 + self.match(Q3Parser.SemiColon) + self.state = 117 + self.match(Q3Parser.RBrace) + + print(f"\tBeginFunc {self.current_function_params * 4}") + print(self.get_method_body()) + print(f"\tretrun {localctx.first.value_attr}") + self.clear_method_body() + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class VarDeclarationContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.varType = None # TypeContext + self.varID = None # IdentifierContext + + def SemiColon(self): + return self.getToken(Q3Parser.SemiColon, 0) + + def type(self): + return self.getTypedRuleContext(Q3Parser.TypeContext,0) + + + def identifier(self): + return self.getTypedRuleContext(Q3Parser.IdentifierContext,0) + + + def getRuleIndex(self): + return Q3Parser.RULE_varDeclaration + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterVarDeclaration" ): + listener.enterVarDeclaration(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitVarDeclaration" ): + listener.exitVarDeclaration(self) + + + + + def varDeclaration(self): + + localctx = Q3Parser.VarDeclarationContext(self, self._ctx, self.state) + self.enterRule(localctx, 14, self.RULE_varDeclaration) + try: + self.enterOuterAlt(localctx, 1) + self.state = 120 + localctx.varType = self.type() + self.state = 121 + localctx.varID = self.identifier() + self.state = 122 + self.match(Q3Parser.SemiColon) + + self.define_variable((None if localctx.varType is None else self._input.getText(localctx.varType.start,localctx.varType.stop)), (None if localctx.varID is None else self._input.getText(localctx.varID.start,localctx.varID.stop))) + self.current_function_params += 1 + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodParamContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.paramType = None # TypeContext + self.paramID = None # IdentifierContext + + def type(self): + return self.getTypedRuleContext(Q3Parser.TypeContext,0) + + + def identifier(self): + return self.getTypedRuleContext(Q3Parser.IdentifierContext,0) + + + def getRuleIndex(self): + return Q3Parser.RULE_methodParam + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMethodParam" ): + listener.enterMethodParam(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMethodParam" ): + listener.exitMethodParam(self) + + + + + def methodParam(self): + + localctx = Q3Parser.MethodParamContext(self, self._ctx, self.state) + self.enterRule(localctx, 16, self.RULE_methodParam) + try: + self.enterOuterAlt(localctx, 1) + self.state = 125 + localctx.paramType = self.type() + self.state = 126 + localctx.paramID = self.identifier() + + self.define_variable((None if localctx.paramType is None else self._input.getText(localctx.paramType.start,localctx.paramType.stop)), (None if localctx.paramID is None else self._input.getText(localctx.paramID.start,localctx.paramID.stop))) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class TypeContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def IntegerType(self): + return self.getToken(Q3Parser.IntegerType, 0) + + def LBrack(self): + return self.getToken(Q3Parser.LBrack, 0) + + def RBrack(self): + return self.getToken(Q3Parser.RBrack, 0) + + def BooleanType(self): + return self.getToken(Q3Parser.BooleanType, 0) + + def identifier(self): + return self.getTypedRuleContext(Q3Parser.IdentifierContext,0) + + + def getRuleIndex(self): + return Q3Parser.RULE_type + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterType" ): + listener.enterType(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitType" ): + listener.exitType(self) + + + + + def type(self): + + localctx = Q3Parser.TypeContext(self, self._ctx, self.state) + self.enterRule(localctx, 18, self.RULE_type) + try: + self.state = 135 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,8,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 129 + self.match(Q3Parser.IntegerType) + self.state = 130 + self.match(Q3Parser.LBrack) + self.state = 131 + self.match(Q3Parser.RBrack) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 132 + self.match(Q3Parser.BooleanType) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 133 + self.match(Q3Parser.IntegerType) + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 134 + self.identifier() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class StatementContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.value_attr = str() + self.type_attr = str() + self.first = None # ExpressionContext + self.first_s = None # StatementContext + self.second_s = None # StatementContext + self.varID = None # IdentifierContext + self.varEXP = None # ExpressionContext + self.eqEXP = None # ExpressionContext + + def LBrace(self): + return self.getToken(Q3Parser.LBrace, 0) + + def RBrace(self): + return self.getToken(Q3Parser.RBrace, 0) + + def statement(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q3Parser.StatementContext) + else: + return self.getTypedRuleContext(Q3Parser.StatementContext,i) + + + def IfSmt(self): + return self.getToken(Q3Parser.IfSmt, 0) + + def LPran(self): + return self.getToken(Q3Parser.LPran, 0) + + def RPran(self): + return self.getToken(Q3Parser.RPran, 0) + + def ElseSmt(self): + return self.getToken(Q3Parser.ElseSmt, 0) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q3Parser.ExpressionContext) + else: + return self.getTypedRuleContext(Q3Parser.ExpressionContext,i) + + + def WhileSmt(self): + return self.getToken(Q3Parser.WhileSmt, 0) + + def SemiColon(self): + return self.getToken(Q3Parser.SemiColon, 0) + + def Equals(self): + return self.getToken(Q3Parser.Equals, 0) + + def identifier(self): + return self.getTypedRuleContext(Q3Parser.IdentifierContext,0) + + + def LBrack(self): + return self.getToken(Q3Parser.LBrack, 0) + + def RBrack(self): + return self.getToken(Q3Parser.RBrack, 0) + + def getRuleIndex(self): + return Q3Parser.RULE_statement + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStatement" ): + listener.enterStatement(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStatement" ): + listener.exitStatement(self) + + + + + def statement(self): + + localctx = Q3Parser.StatementContext(self, self._ctx, self.state) + self.enterRule(localctx, 20, self.RULE_statement) + self._la = 0 # Token type + try: + self.state = 187 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,10,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 137 + self.match(Q3Parser.LBrace) + self.state = 141 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << Q3Parser.T__0) | (1 << Q3Parser.LBrace) | (1 << Q3Parser.WhileSmt) | (1 << Q3Parser.IfSmt) | (1 << Q3Parser.IDENTIFIER))) != 0): + self.state = 138 + self.statement() + self.state = 143 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 144 + self.match(Q3Parser.RBrace) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 145 + self.match(Q3Parser.IfSmt) + self.state = 146 + self.match(Q3Parser.LPran) + self.state = 147 + localctx.first = self.expression(0) + self.state = 148 + self.match(Q3Parser.RPran) + + else_label = self.create_label() + temp = self.create_temp() + self.add_to_method_body(f"\t{temp} = {localctx.first.value_attr}") + self.add_to_method_body(f"\tifZ {temp} goto {else_label}") + + self.state = 150 + localctx.first_s = self.statement() + + end_label = self.create_label() + self.add_to_method_body(f"\t{localctx.first_s.value_attr}") + self.add_to_method_body(f"\tgoto {end_label}") + + self.state = 152 + self.match(Q3Parser.ElseSmt) + self.state = 153 + localctx.second_s = self.statement() + + self.add_to_method_body(f"{else_label}:") + self.add_to_method_body(f"\t{localctx.second_s.value_attr}") + self.add_to_method_body(f"{end_label}:") + + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + + while_label = self.create_label() + self.add_to_method_body(f"{while_label}:") + + self.state = 157 + self.match(Q3Parser.WhileSmt) + self.state = 158 + self.match(Q3Parser.LPran) + self.state = 159 + localctx.first = self.expression(0) + self.state = 160 + self.match(Q3Parser.RPran) + + after_while_label = self.create_label() + temp = self.create_temp() + self.add_to_method_body(f"\t{temp} = {localctx.first.value_attr}") + self.add_to_method_body(f"\tifZ {temp} goto {after_while_label}") + + self.state = 162 + localctx.first_s = self.statement() + + self.add_to_method_body(f"\t{localctx.first_s.value_attr}") + self.add_to_method_body(f"\tgoto {while_label}") + self.add_to_method_body(f"{after_while_label}:") + + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 165 + self.match(Q3Parser.T__0) + self.state = 166 + self.match(Q3Parser.LPran) + self.state = 167 + localctx.first = self.expression(0) + self.state = 168 + self.match(Q3Parser.RPran) + self.state = 169 + self.match(Q3Parser.SemiColon) + + self.add_to_method_body(f"\tpush {localctx.first.value_attr}") + self.add_to_method_body(f"\tSystem.out.println") + self.add_to_method_body(f"\tPopParams 4") + + pass + + elif la_ == 5: + self.enterOuterAlt(localctx, 5) + self.state = 172 + localctx.varID = self.identifier() + self.state = 173 + self.match(Q3Parser.Equals) + self.state = 174 + localctx.varEXP = self.expression(0) + self.state = 175 + self.match(Q3Parser.SemiColon) + + #self.add_to_method_body((None if localctx.varID is None else self._input.getText(localctx.varID.start,localctx.varID.stop))) + #self.add_to_method_body(localctx.varEXP.value_attr) + if localctx.varEXP.type_attr == "str": #right side is math exper + temp = self.create_temp() + localctx.value_attr = f"{temp} = {localctx.varEXP.value_attr}\n{(None if localctx.varID is None else self._input.getText(localctx.varID.start,localctx.varID.stop))} = {temp}" + self.add_to_method_body(f"\t{temp} = {localctx.varEXP.value_attr}") + self.add_to_method_body(f"\t{(None if localctx.varID is None else self._input.getText(localctx.varID.start,localctx.varID.stop))} = {temp}") + else: + localctx.value_attr = f"{(None if localctx.varID is None else self._input.getText(localctx.varID.start,localctx.varID.stop))} = {localctx.varEXP.value_attr}" + self.add_to_method_body('\t' + localctx.value_attr) + + pass + + elif la_ == 6: + self.enterOuterAlt(localctx, 6) + self.state = 178 + localctx.varID = self.identifier() + self.state = 179 + self.match(Q3Parser.LBrack) + self.state = 180 + localctx.varEXP = self.expression(0) + self.state = 181 + self.match(Q3Parser.RBrack) + self.state = 182 + self.match(Q3Parser.Equals) + self.state = 183 + localctx.eqEXP = self.expression(0) + self.state = 184 + self.match(Q3Parser.SemiColon) + + localctx.value_attr = f"{(None if localctx.varID is None else self._input.getText(localctx.varID.start,localctx.varID.stop))}[{localctx.varEXP.value_attr}] = {localctx.eqEXP.value_attr}" + self.add_to_method_body('\t' + localctx.value_attr) + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ExpressionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.value_attr = str() + self.type_attr = str() + self.is_var = bool() + self.is_complete = bool() + self.first = None # ExpressionContext + self.intt = None # Token + self.tr = None # Token + self.fa = None # Token + self.iden = None # IdentifierContext + self.oper = None # Token + self.second = None # ExpressionContext + + def INTEGER_LITERAL(self): + return self.getToken(Q3Parser.INTEGER_LITERAL, 0) + + def TRUE(self): + return self.getToken(Q3Parser.TRUE, 0) + + def FALSE(self): + return self.getToken(Q3Parser.FALSE, 0) + + def identifier(self): + return self.getTypedRuleContext(Q3Parser.IdentifierContext,0) + + + def This(self): + return self.getToken(Q3Parser.This, 0) + + def New(self): + return self.getToken(Q3Parser.New, 0) + + def IntegerType(self): + return self.getToken(Q3Parser.IntegerType, 0) + + def LBrack(self): + return self.getToken(Q3Parser.LBrack, 0) + + def RBrack(self): + return self.getToken(Q3Parser.RBrack, 0) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q3Parser.ExpressionContext) + else: + return self.getTypedRuleContext(Q3Parser.ExpressionContext,i) + + + def LPran(self): + return self.getToken(Q3Parser.LPran, 0) + + def RPran(self): + return self.getToken(Q3Parser.RPran, 0) + + def Exclamation(self): + return self.getToken(Q3Parser.Exclamation, 0) + + def Operations(self): + return self.getToken(Q3Parser.Operations, 0) + + def Dot(self): + return self.getToken(Q3Parser.Dot, 0) + + def functionParams(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q3Parser.FunctionParamsContext) + else: + return self.getTypedRuleContext(Q3Parser.FunctionParamsContext,i) + + + def Comma(self, i:int=None): + if i is None: + return self.getTokens(Q3Parser.Comma) + else: + return self.getToken(Q3Parser.Comma, i) + + def getRuleIndex(self): + return Q3Parser.RULE_expression + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpression" ): + listener.enterExpression(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpression" ): + listener.exitExpression(self) + + + + def expression(self, _p:int=0): + _parentctx = self._ctx + _parentState = self.state + localctx = Q3Parser.ExpressionContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 22 + self.enterRecursionRule(localctx, 22, self.RULE_expression, _p) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 223 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,11,self._ctx) + if la_ == 1: + self.state = 190 + localctx.intt = self.match(Q3Parser.INTEGER_LITERAL) + + localctx.value_attr = (None if localctx.intt is None else localctx.intt.text) + localctx.type_attr = "int" + + pass + + elif la_ == 2: + self.state = 192 + localctx.tr = self.match(Q3Parser.TRUE) + + localctx.value_attr = (None if localctx.tr is None else localctx.tr.text) + localctx.type_attr = "boolean" + + pass + + elif la_ == 3: + self.state = 194 + localctx.fa = self.match(Q3Parser.FALSE) + + localctx.value_attr = (None if localctx.fa is None else localctx.fa.text) + localctx.type_attr = "boolean" + + pass + + elif la_ == 4: + self.state = 196 + localctx.iden = self.identifier() + + localctx.value_attr = (None if localctx.iden is None else self._input.getText(localctx.iden.start,localctx.iden.stop)) + localctx.is_var = True + localctx.type_attr = self.var_dict[(None if localctx.iden is None else self._input.getText(localctx.iden.start,localctx.iden.stop))] + + pass + + elif la_ == 5: + self.state = 199 + self.match(Q3Parser.This) + + + pass + + elif la_ == 6: + self.state = 201 + self.match(Q3Parser.New) + self.state = 202 + self.match(Q3Parser.IntegerType) + self.state = 203 + self.match(Q3Parser.LBrack) + self.state = 204 + localctx.first = self.expression(0) + self.state = 205 + self.match(Q3Parser.RBrack) + + self.current_function_params += 1 + + pass + + elif la_ == 7: + self.state = 208 + self.match(Q3Parser.New) + self.state = 209 + self.identifier() + self.state = 210 + self.match(Q3Parser.LPran) + self.state = 211 + self.match(Q3Parser.RPran) + + + pass + + elif la_ == 8: + self.state = 214 + self.match(Q3Parser.Exclamation) + self.state = 215 + localctx.first = self.expression(2) + + self.add_to_method_body(f"\t{self.create_temp()} = !{localctx.first.value_attr}") + + pass + + elif la_ == 9: + self.state = 218 + self.match(Q3Parser.LPran) + self.state = 219 + localctx.first = self.expression(0) + self.state = 220 + self.match(Q3Parser.RPran) + + localctx.value_attr = localctx.first.value_attr + localctx.type_attr = localctx.first.type_attr + localctx.is_var = localctx.first.is_var + + pass + + + self._ctx.stop = self._input.LT(-1) + self.state = 259 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,15,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + self.state = 257 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,14,self._ctx) + if la_ == 1: + localctx = Q3Parser.ExpressionContext(self, _parentctx, _parentState) + localctx.first = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) + self.state = 225 + if not self.precpred(self._ctx, 13): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 13)") + + self.state = 226 + localctx.oper = self.match(Q3Parser.Operations) + self.state = 227 + localctx.second = self.expression(14) + + #self.add_to_method_body(localctx.first.type_attr) + #self.add_to_method_body(localctx.second.type_attr) + #self.add_to_method_body((None if localctx.oper is None else localctx.oper.text)) + #if localctx.first.type_attr != localctx.second.type_attr: + # self.add_to_method_body('i think we messd up') + #else: + localctx.value_attr = f"{localctx.first.value_attr} {(None if localctx.oper is None else localctx.oper.text)} {localctx.second.value_attr}" + localctx.type_attr = "str" + localctx.is_complete = True + + pass + + elif la_ == 2: + localctx = Q3Parser.ExpressionContext(self, _parentctx, _parentState) + localctx.first = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) + self.state = 230 + if not self.precpred(self._ctx, 12): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 12)") + self.state = 231 + self.match(Q3Parser.LBrack) + self.state = 232 + localctx.second = self.expression(0) + self.state = 233 + self.match(Q3Parser.RBrack) + + temp = self.create_temp() + self.add_to_method_body(f"\t{temp} = {localctx.first.value_attr}[{localctx.second.value_attr}]") + localctx.value_attr = temp + + pass + + elif la_ == 3: + localctx = Q3Parser.ExpressionContext(self, _parentctx, _parentState) + localctx.first = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) + self.state = 236 + if not self.precpred(self._ctx, 11): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") + self.state = 237 + self.match(Q3Parser.Dot) + self.state = 238 + self.match(Q3Parser.T__1) + + + pass + + elif la_ == 4: + localctx = Q3Parser.ExpressionContext(self, _parentctx, _parentState) + localctx.first = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) + self.state = 240 + if not self.precpred(self._ctx, 10): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 10)") + self.state = 241 + self.match(Q3Parser.Dot) + self.state = 242 + localctx.iden = self.identifier() + self.state = 243 + self.match(Q3Parser.LPran) + self.state = 252 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << Q3Parser.INTEGER_LITERAL) | (1 << Q3Parser.LPran) | (1 << Q3Parser.Exclamation) | (1 << Q3Parser.TRUE) | (1 << Q3Parser.FALSE) | (1 << Q3Parser.This) | (1 << Q3Parser.New) | (1 << Q3Parser.IDENTIFIER))) != 0): + self.state = 244 + self.functionParams() + self.state = 249 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==Q3Parser.Comma: + self.state = 245 + self.match(Q3Parser.Comma) + self.state = 246 + self.functionParams() + self.state = 251 + self._errHandler.sync(self) + _la = self._input.LA(1) + + + + self.state = 254 + self.match(Q3Parser.RPran) + + localctx.value_attr = self.create_temp() + self.add_to_method_body(f"\t_LCall {(None if localctx.iden is None else self._input.getText(localctx.iden.start,localctx.iden.stop))}") + self.add_to_method_body(f"\tPopParams {localctx.value_attr}") + self.params = 0 + localctx.type_attr = "ret_var" + + pass + + + self.state = 261 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,15,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.unrollRecursionContexts(_parentctx) + return localctx + + + class FunctionParamsContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.paramss = None # ExpressionContext + + def expression(self): + return self.getTypedRuleContext(Q3Parser.ExpressionContext,0) + + + def getRuleIndex(self): + return Q3Parser.RULE_functionParams + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunctionParams" ): + listener.enterFunctionParams(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunctionParams" ): + listener.exitFunctionParams(self) + + + + + def functionParams(self): + + localctx = Q3Parser.FunctionParamsContext(self, self._ctx, self.state) + self.enterRule(localctx, 24, self.RULE_functionParams) + try: + self.enterOuterAlt(localctx, 1) + self.state = 262 + localctx.paramss = self.expression(0) + + self.params += 1 + self.add_to_method_body(f"\tpush {localctx.paramss.value_attr}") + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class IdentifierContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.value_attr = str() + self.type_attr = str() + + def IDENTIFIER(self): + return self.getToken(Q3Parser.IDENTIFIER, 0) + + def getRuleIndex(self): + return Q3Parser.RULE_identifier + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIdentifier" ): + listener.enterIdentifier(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIdentifier" ): + listener.exitIdentifier(self) + + + + + def identifier(self): + + localctx = Q3Parser.IdentifierContext(self, self._ctx, self.state) + self.enterRule(localctx, 26, self.RULE_identifier) + try: + self.enterOuterAlt(localctx, 1) + self.state = 265 + self.match(Q3Parser.IDENTIFIER) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + + def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): + if self._predicates == None: + self._predicates = dict() + self._predicates[11] = self.expression_sempred + pred = self._predicates.get(ruleIndex, None) + if pred is None: + raise Exception("No predicate with index:" + str(ruleIndex)) + else: + return pred(localctx, predIndex) + + def expression_sempred(self, localctx:ExpressionContext, predIndex:int): + if predIndex == 0: + return self.precpred(self._ctx, 13) + + + if predIndex == 1: + return self.precpred(self._ctx, 12) + + + if predIndex == 2: + return self.precpred(self._ctx, 11) + + + if predIndex == 3: + return self.precpred(self._ctx, 10) + + + + + diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__init__.py b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Lexer.cpython-38.pyc b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Lexer.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5638ba603f612e1c65db6c16c39c6c7c5ef19413 GIT binary patch literal 7814 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 bbTQ}&Ah6WkF3a&?r>z$7=0XUlfp`BC{JH`G literal 0 HcmV?d00001 diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Listener.cpython-38.pyc b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Listener.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15e910e6fb296cad981761fa5827ea3f5aa12451 GIT binary patch literal 4794 zcmb_f>rNX-6yCKB7_f~E7<0eh3<0NwHl#O2B~4Scp+V4#TvhJMGms7Tn$8-DRF$f# z>09&#c$YrG{^^hY$}99&&zWUr&n`$&G_mBx-+mwGJ7?zX?94a${D1|Yy(ji`gyf*y1)zo%M@Vmge?ZFZ|80o>r=zs;6wr%YjOx&n?!=`d(VB zkEj1g*E2t)Sn9~CW?w-xt7-@K#zA0jzp_J=J=}Tf2%n24()5!C@BqI4-yr2y-DXxj z#naC-%>E0KVd$)nFZlu+ z0$k9z$Vz~R02d`c%tip0G#+JTz{7w?BtOO~fJZeRXA^+SfX5_1$)*5TG@fQNfX4w( zNPd>h0iM)&o-F{L0z57GMYaTZM&o6+0(chioa9&88sK@2*I5J{;$LYs*WY&>&WglEwSE(T5^VW&zgS(<%UH-dQ zd)8_5n%`lylZ)n=>z!_0cy6uPX`j0-E^3dz+pQh$)K0kvf0Xt1`HLXOy)G9|MdwsF z?Hu~aMC@NGL`OBRPgG=8S^^)mC`*CygF$}jcCQWL@zaK5)G(45`xRvNPaN0VZ#lkS zCYBS_630QSj9v3sr4BbiOvkAy6&ZVu=t>{*6W4RQZpWJ?&a>26l^aQo{fAY}QOreR zKSS-W3y+k>?qylMoa2YQ*>Z$~^{NQT`dNyO#?n;|JS&S8j*#DUZ1_lf)D?L&YvW8Xql zJI4E%*v8fyUG!UV4ZB~BqI&v2CFZdar_-*)#+A$NPp0sQq>$|Xq}Dita0UF<5v29M zBnjMD0pn6*f4Kt2V}4ESlPh3cY3yDk9S@sIr+rMkr*3a~sWWySih5oK{GJ%co;BU{ zZ^yS^R($;8oc~B1N0X(Zz_`XN)`*cDVl_gou6bjpaL01gb-KI_1)dPU*b0IVu~r$o z${mXi_nep}cPv_D>=~}npIx2{?)&hz?hw~l-(abc%-C11(NR2~*v3W}W;9Y6yN0XN zqYJNzI}`Z?_?N``#_AN88vD!DDIW7zVxL@{;!0!paIU{#(9!OR%f;`+`o>&GGGkvk z*HOGbiEVPOBh^85JIFQ~9=yOCjbNbBXm{8}3xDStjh`=^R>+7Rh*mFLpJw(u(59DN zk%yb2fJ{-J02DWb93Fe>W#pp$uM(6{FpPpqawDlEBPba~$+&uh>iw?L;4w#xp{5jS zaF?OT3X`%&0upWq?f$Lz9p N(JrKN>Edrz>VLU{^f~|l literal 0 HcmV?d00001 diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Parser.cpython-38.pyc b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Parser.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4324aa7b5f493d157ee023062560c99e14fbd05 GIT binary patch literal 51066 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.|@}m_`(;E)Vnjq%#PDMUOaMhdKq!OOwmIcnRd$yP5>%LDnCZ z5jfs}t72CsvQ@Vsc{#0aviD3)G5C*o<0F!0+p58h;DnX6|Bhj0-8=vf&6E5s924^- zxsP+h;6(J^yYX$+*nQTZ)q;s*uvVlRvrVIZ*rjQ;$SU6;Y|4Gj`4;;1O%vF9%yo#Cx-2{68KKHNhm}5yV zthCA%I>C;SXMn4^YNL~rj>$8zR?G3on)yfcqY|qW!Jy)u;&KYh%;G>*c4&BNW@@hf zf5PTn0;JMR%~MZtV~y85?OrKkts?B+^_SPDkfvT<$2U#a(>LLkD(Ic!il*xpdugRf znkH(xPsAjBn#UyV$S@VM{iGIU>JP_Tl$`^y!OG=0w71vHWb3ZK|BDS`3EflqoX*dp#;BF#0j?PQIB=&@k;~PfF9a=-Y9| z#6IHl17h~%QZyT8*pEcA=+zFH~*N_ z*455kiO}W>x+fkKdPine7v#X$grC#{B;iU`mt||VW_@?;*BqBi)+wrphVgj3@u{|RsW182=yK%nUg>C+w5by?^38K%+vYwf({z+ zGqZe^CA)}cO8QPy(>;4e7ojcMtUaR$$Bi6)^ZOP%J4z9@gmq{esF&jOiD8}rK0PR> zPjE9sY8g^&$e#|*JZRlz2G?@OW%KF5yMq;{PrP>>%m$)pgy~8@KGV1}AOYxalvI zI?G(j{Ff1keOrdD3~Cw5vq*_MyhXqe-QfL9AugBursPtT2be?+U0+AYJ=KDnA-Zwj zgOuze#^=bjKm)O@0LwUe-3Y{^0tBaP8OdkhxC#}4mNIabZ3^$wK9+IZiH)c1qHV>~ zqYiY<;{Ixqxe z99`f|Y^gF`peqQ}B>p61k=g8rM^LWHF2larO+qmBQxR6CU2aoSq0SG?Du5vF8H;xKMCERb%f zgrz(ihsRsPI(z}NRdyrtctfOD^LP_=q*K7*$q|;?gq~B6&^!pulo2}7psV8UCejJY zbk9D00y@E8;I%K2yc#+|hL!Pdi0ATd^HAc6dAHnO<({vt6BLb~bt0FyFX8k`xkeDY zh}b9*My+5>w1S7qw1P3w3dV4@7H3)e8YITEWic8gMgwD590qRJoNnK)Io;+=X2`i% zd?e6wE*3W~_07s_ouRnqOi6nT0FKdDNo(S?-dUH4AL2j~LwggD&$US_|`={3_ zDg^X8HG3-Sl-^qHn7VlTFz)nACseC#;0h)iZ5QwN!-i^EznZar&GB5j%{9c<_DyQx zngfz+OOVbj(vKoWT`SdZyW&Yd<7~q!OSBWwd6tu{Ckp7wHkSe@O-VI zY{;TtO=t=-e^M{+*$DUpPu}kRz}~#YCN}k}rp%w#%a)DyA12IJY&=uXw#*bKyS{4G zIs<<0A;IMVye0R1Fk|YqKCT%2C!W0BT{zynPh#N{IP^#JEo<-UJPfz~tO?2M; zPobb|T{FzYopt^)&WH8Z`9CFXdYyOmOkV0v!2&OL3ww#$P>-lQD(shKMAe=ts+RPY z36^x36gUV?4hd6wtE?AnqDgPOjf3u=k-S#CWu1E~yJCvrW!;x`t4$Go2%UJHhXLZe z++T}9f|mqGaOTZ1GQ{#Ydj=tt{*I9$2$RCMthHW=id%1ZX@q!dT`gsA!Ohdhx?0M) zeu_SF>TNI!gGCf+73{R46lV1mRE#I5-v+lMUL5iM+Kv~Oc+M7Do#)^(#7oEtG#Ez6 ziKv9cbS|T6^(gMKy#^=Xt}ojx%MCUW_gZ3cal6gK}WMExew9 ztub~l!F>dW=_lHInYYfPA9dKGl^>(>x?{E_MzdWj*^o==muGa5edVy2=>9txAk2sG zCn8JN?S3vpqJ?K1FQ(Bz?tCf*`nyv#FMcAA`Zw%~v9%zNDq_t{%QW@ci^k}mlc!ZU(Uo9oEqOysCzf@N;^Jzn9$Vk zDCVc{=vfYCztgXaiDPh7h<)ihO{8NmgrGwG%z(>1wKmSA=6p?W%9NP1StYe{r!xIYPwuWgu&O3b+#Fd}5zFgU z1Ou-2km3qtRis!S51e{6j4P1s@Z>#ChZsjHLjvQUN*-4X-|fkNoU(r*viJ>?%e#(1 z&iQ*2e)TrpSvM(XoVmYdN2I)y^ibid#j9HX6w0O6P0Bh4M>yTd;ZjdHy@gcbhvg3E zNXHp4r$9oLo0O}_+f|ReJc#NpBX6A9q)Jw`w$ja=Kw_1BJu{Gzb#LG@VlxT270y~5 zIK^6BjlZ!U|)%pl$-DBNX=;z)8xrBN6T)R9gv*c!myV#@ zR4M3|rIyIIAin=D?wX70)2DMFICIxrh@!6jY?d8z^uhHlxVD9ub%6`9@(Wz%Xkpnp zN9tS?<1L5I`QY>V=4R3==TMJ^2BA0?q1iC^*ySo0nizPcWX5RF@l{am z%WcyrAuQ>q;eDouT9^|{s)XQjkB*W+Wg!g&>Mty1TE;yA5f)kettyKzdk4mDu4$OXVwNf|@6%4qMG z>4ZWsY##Fa?!wjr+#?@D+|`)-qxrL-0*qPX8!nXGa@jk1V|T~K*~z=U%iN8nNp|v% z$&p$20N%q082c(i|DM<*1Qcz?j?zz*gp|z2o+5affO631{@CY%wu{?xp;+(UWLqxW zwr?mq)HX(WC>M@d4lcoC-vlsQ$xn!ykvz{BH<*pRM35(V8NgCKzDDQk1aA<$N$?iH z=i%7!NM?UqZhEZxQ|!4!Y{$^B*c~%%Ypri;Qvo?f_2d}UlVhTkyplwG1y0$$JVpiN z*!u(@5ODX-*bfOlB=`v6bN@}b;4LU+#~Mp8<)UAy4dr*4Jlm6*r#Ze#RQMZiIyP7G zU6I>_$#M4_3-=>Dk8nD&@mRPYnuyIW6C5U>M$Ft!ATsmS#DpUfW{7$)Q+T5;VpkDV zn1yFEl{p00FtnCZHts5A&25bIHlkyr5Wcf+eNmX7?;RM%M`59SlkWp38|0hxwqsiN zUVPdv?Zt`TbzUVzMLCwD}SN-jr!;Lxh*;l ze1@MlgE3Yd)@!=tErdA!I)$<~5z~pwjarpIY^jbTMTY`z=+be5O`u>SXjpHYhcpbE z%Cb1#_{L?-$*Yuhzd@iyn;uk7*BJ$FS^owA#h>Us|7*v9O8%O!$aR68LR4%!GL8RGF*jCH5pqsY~M9?I>z5b-|orV-3M2l_ep50%G#r| zUPUnAOb;>Rw#WY7%*nOK>Uv}_pwmN!yJw)fPP)>!Pniny60WUBn0;J>24Wn%XM1vX z6<5_ce{p+w)_N##_3qUad?DJy^Cy|Pr9M2xrl}ol7&5k%4MW~+Jt>2>$1zQfH&oL4 zF!ROJq0~D5H!N{Iy_>Q_;DhxD%p*NjMxbkXag)&mB5~5!VOX*TFQd2qFPOl* zA*`@)pThfzq%O>lupSlrrMSd+j2|)s%ETiBp5x>MZqcOqx{)PiBCvKe+jb7yxg<5a9R#?~3cCD0A5xBtM&y=( z59FInh@EfB8r<|Z8cel}2K!p%1X~`ux-eZhyB18f;u8E|YC1HwkKk=?0{ow1%W&St zHzN@~6Y*!t+yB*md#3$%+Pn8w8y9VckHC*?51p=wkh5o1Mb!iWK5V zp;1!!uG}iX6mSOt-kyuM=h|=IYHJ!B^YiH2H(%fa9A;oyngOA|?_1<~<7mA%<}&T+ zNBx6GkuyFB0NQ_FZYFSOKaKT_@L`0vBHS=H!Y<-VIpLNi1Dh4K&tlQ0(o*8Y5lty< zA(qclvCjlk%fuq$#1W0_C}g+3^y&XGKyQgc1&S$X2>eaXSPqk&cp zCoR#$D_S)iAJNDUzJv4@N_u~)XwPs$JA`7|Bj~eKMWwx93&^ifZGdMU!#BLtV$|od zzE;P6F?cIdTY}UA<|T@j1Sd5scUlsx)Lj|N9!4eJXX3t%MEuE7#RAK&LwD~}mR zgPE1eP^$dA~h4`HBw17fBedoz&2%7!& zSURt78d`}V=SwS*rdG9vwJKv`9c*P+pv^G8VUf9cQYE0>z%9XADZ$@WmEc?{0j&j2 z`&vDo)&lxCJ^p;P&J)M(@$6l9!B#4LEshdgpi8;lDT})Bg^0{|oM~DyPu+uZaHa{F z|8-L3xTvfguoWK-Wqw#yj*F!nmw0HrKt{%;9-sB}!F=#i0jayv}JXoI@kwsS|!VOZE3(H23w{drj(dXO~WAvS-L)$cV5iv&%(11mjZYU+zeH+r zSY7EU(kcjzmy%oV@Yh9tP z!5f_MFo)SI^QCHsjHqjCP~)t{dNw*5IGD99T9?716*XaixC^&8!lIQxDjTFU8^ITd zm0w(Fd&^~8v=VnGDlJ+#TnB2f$vp`D@6Imsda^&@N$maY|Bcwi0AnI7zecCnuYL+F z8KH(X-92cTp$ZH;Irmz z?e6VQE9)kk?ra*8YZ`ak3=QTMWYYb6JBQ754}R(laiw~)cdTqX`<#xkKf~)|zX15$ z-zIwIvALMKH!UQY7n6fY1H6jQ#BdubM= z2QI(ERK80vMBpBGc#lru>+fb#_tB|!`=;>vUtz#12HZpJYGU^it1!ro((e#MYsmy6 z4u~~SY<4-u6Eoo~Vj>+JCPoWk$=JTzT*2hd1SmD9hP%y7dV6msn;uM?nbM4`*}HFF z+T3DGGFuLzYD%+dXNCT1^v`LSp1}1(*Lwa=%YNQ>^>_?~X>x?D!DUNXAJ!s6!V|CTv{xtjST4WHbfZ z4l%GH1w)ycwZg<$*-09NxEwLIa!vCiYqpOv5p3@ePr3WQ#UI2!o)K|Qk?@2`*xzK# z!6ocLm+7h_X+?whSi?TOp(%sCt|wN%a=D|<DXq$e@I;^J-8z8+}9p+w) zQJ$36IGwyoOzv1JPu(H(H|i0ZN5vj2Bh=L}mM5hNtyGOACeVnTMK^l{W9pf*LK zsCR+}D`elaPX98kegNTGH}z9ECf=2sdprlJqt;F9IA+Q_9U;3yTM@T!I-&%}yViNR zM8e^i!TW9w`m&9}flWY5S3~X&a~ft?$NK6ScT7 zl}};X4tAMIP-#uu(17|nnyty2C99mQ3v91E17xxm@lxt?O0zR%%-30$bAWhfXY6Ri zbkgKs24>vDboc7%5HrGuc%>9GAs%lVROvfPF=`qF?UByRB=N`Tnr`9Yb^}4x_@JLP z%+{=5w$0IpwjiJKUnHTh2N}wD%%ClZnp|^hHmHnjXw*3DpY1#Bzt2AiZReIl| zfl^GXP(&}{y^YuWP1gBu0hEG#p<=H`DPkw|5i7I_dC`PPxsaPYTa8?czCXZ@h_S~y zlq7rDTb)1Ry2@^b1J&V2g~3dcX9f9TCPBgB%S*FyAi(y;9T(z@<3A=;XSQ$H_Km>z zM(v9`EbOX_by@rYbxP9ttUI00rIWfcQHP1D1_Xb?I^ce5bbx~l)Fr5>4)fn3W`R}F zf@nOI-4t+tp1T68TcX1+1a;g|!4#I7_u+oOfo^jvlwSN?N~syQHg8U6(q?aWe{T+3 z9UGL#l^}in03~cZ9>JHF&?QRED&5mdz0U3-O9wE(2(xxbpP}l^p2{|L_v}xbgA7dc z_rlcN-OnsDrN+#i1AB)0dwaxbeuJ453I2rO&j~&!fG*Q#%FWbrspJK8%Dot}9b6Pj z!f|mVTf@joKeT)3Kzh)8ifOFmOP><7(ka`*-HqR((V5Kv4qxlumU+bH6OiFD7ZOm? zG*2UFBUntZgkUMbGJ?|ymJ^7AM$|;IOPsnH%YM9)*eU{7?IbhK+4NgOa1Oy*fKniH zX9oLDvubE0iw}aaM7y$Px_iJxkMNnj1fs&alh|DZ!exrO>RvkUAow!D-2{gT?k9MF z;8lV*2`(czO0a>TK(LYE>jaw!eo3&I;2#OL5d0ItR)Sv;Tu$)M1XmEmS>@Y^{V~Cn z1k??huMrc@SUBkIbjtM1nY7eEU7_87%->^t4g&KH#^P#a0h3q*K_kGu_+|DZS`?a> zCS!&XhStb{kyHP3U9~Wu;rjZFe+@>;-gd$&pYB^uh?Sq?`j=pgnyotj915M-*7N@f zLSIwojj8(^^P)N}Xq6zng`?IN4ni$UqKjHCi=Nf8IJ%(a+~|2Ns|BCaa!&MI_|0uu z6rI(wEZW&}P4p|isr8PAQrOZ_mWCi3aR`b} z%mS(2!M#JJFm4j*9o#3KHpy#6;OInr&Mc)cwkl!jvDRp}c?DzhmZBF83@P-8OPIWM R!!K3?OoGq@CIZos{|`~VgBJh* literal 0 HcmV?d00001 diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/__init__.cpython-38.pyc b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88d17177f603201dbd376ab660acdec5b24208fb GIT binary patch literal 144 zcmWIL<>g`k0`aBy5FYLUK2xQTwCv3`1Lo_>6MW?p7Ve7s&k skip; + +BlockComment: '/*' .*? '*/' -> skip; + +LineComment: '//' ~ ('\r' | '\n')* -> skip; + +Newline: ('\r' '\n'? | '\n') -> skip; \ No newline at end of file diff --git a/HW4-keyvan-dadashzadeh-97522148/Q4/Q4.py b/HW4-keyvan-dadashzadeh-97522148/Q4/Q4.py new file mode 100644 index 0000000..b1b1316 --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q4/Q4.py @@ -0,0 +1,181 @@ +import random +import networkx as nx +import matplotlib.pyplot as plt +from networkx.drawing.nx_agraph import graphviz_layout + +from antlr4 import * + +from gen.Q4Lexer import Q4Lexer +from gen.Q4Parser import Q4Parser +from ast_list import Q4ASTListener + +import argparse + + +def main(args): + """ + Create lexer and parser and execute AST listener + + Args: + + param (args): + return (None): + """ + # Step 1: Load input source into stream + stream = FileStream(args.file, encoding='utf8') + print('Input language_apps:\n{0}'.format(stream)) + print('Result:') + + # Step 2: Create an instance of AssignmentStLexer + lexer = Q4Lexer(stream) + + # Step 3: Convert the input source into a list of tokens + token_stream = CommonTokenStream(lexer) + + # Step 4: Create an instance of the AssignmentStParser + parser = Q4Parser(token_stream) + # print(dir(parser)) + + # Step 5: Create parse tree + parse_tree = parser.program() + + # Step 6: Create an instance of AssignmentStListener + # code_generator_listener = ThreeAddressCodeGeneratorListener() + # code_generator_listener = ThreeAddressCodeGenerator2Listener() + ast_generator = Q4ASTListener() + # Step 7(a): Walk parse tree with a customized listener (Automatically) + walker = ParseTreeWalker() + # walker.walk(t=parse_tree, listener=code_generator_listener) + walker.walk(t=parse_tree, listener=ast_generator) + + # print_tree(node=ast_generator.ast.root, level=1) + # print('\nG=', ast_generator.g.edges) + draw(g=ast_generator.g) + + # Step 7(b): Walk parse tree with a customize visitor (Manually) + # code_generator_vistor = ThreeAddressCodeGeneratorVisitor() + # code_generator_vistor = ThreeAddressCodeGenerator2Visitor() + # code_generator_vistor.visitStart(ctx=parse_tree.getRuleContext()) + + +# def print_tree(root=None, level=1): +# if root is not None: +# print('.' * level, level, root.value) +# print_tree(root=root.child, level=level + 1) +# print_tree(root=root.brother, level=level + 1) + + +def draw(g: nx.DiGraph = None): + """ + Draw abstract syntax tree + + Args: + + g (nx.DiGraph) + return (None) + """ + pos = nx.kamada_kawai_layout(G=g) + pos = graphviz_layout(G=g, + prog='dot', + # prog='circo', + ) + # pos = nx.bipartite_layout(G=g, nodes=g.nodes) + # pos = nx.spectral_layout(G=g) + # pos = hierarchy_pos(G=g,) + # pos = nx.spiral_layout(G=g) + # pos = nx.spiral_layout(G=g) + colors = [g[u][v]['color'] for u, v in g.edges] + nx.draw(g, + with_labels=False, + node_size=500, + node_color='black', + edge_color=colors, + pos=pos, + ) + edge_labels = nx.get_edge_attributes(g, 'edge_type') + # print('#', edge_labels) + nx.draw_networkx_edge_labels(g, pos, edge_labels=edge_labels, ) + + node_labels = {} + for node in g.nodes(): + # set the node name as the key and the label as its value + node_labels[node] = node.value + nx.draw_networkx_labels(g, pos, node_labels, font_size=12, font_color='w') + plt.savefig('ast1.png') + plt.show() + + +def hierarchy_pos(G, root=None, width=1., vert_gap=0.2, vert_loc=0, xcenter=0.5): + """ + From Joel's answer at https://stackoverflow.com/a/29597209/2966723. + Licensed under Creative Commons Attribution-Share Alike + + If the graph is a tree this will return the positions to plot this in a + hierarchical layout. + + Args: + + G (nx.Graph): the graph (must be a tree) + + root (nx.Node): the root node of current branch + - if the tree is directed and this is not given, + the root will be found and used + - if the tree is directed and this is given, then + the positions will be just for the descendants of this node. + - if the tree is undirected and not given, + then a random choice will be used. + + width (float): horizontal space allocated for this branch - avoids overlap with other branches + + vert_gap (float): gap between levels of hierarchy + + vert_loc (float): vertical location of root + + xcenter (float): horizontal location of root + """ + + if not nx.is_tree(G): + raise TypeError('cannot use hierarchy_pos on a graph that is not a tree') + + if root is None: + if isinstance(G, nx.DiGraph): + root = next(iter(nx.topological_sort(G))) # allows back compatibility with nx version 1.11 + else: + root = random.choice(list(G.nodes)) + + def _hierarchy_pos(G, root, width=1., vert_gap=0.2, vert_loc=0, xcenter=0.5, pos=None, parent=None): + """" + see hierarchy_pos docstring for most arguments + + pos: a dict saying where all nodes go if they have been assigned + parent: parent of this branch. - only affects it if non-directed + + """ + + if pos is None: + pos = {root: (xcenter, vert_loc)} + else: + pos[root] = (xcenter, vert_loc) + children = list(G.neighbors(root)) + if not isinstance(G, nx.DiGraph) and parent is not None: + children.remove(parent) + if len(children) != 0: + dx = width / len(children) + nextx = xcenter - width / 2 - dx / 2 + for child in children: + nextx += dx + pos = _hierarchy_pos(G, child, width=dx, vert_gap=vert_gap, + vert_loc=vert_loc - vert_gap, xcenter=nextx, + pos=pos, parent=root) + return pos + + return _hierarchy_pos(G, root, width, vert_gap, vert_loc, xcenter) + + +if __name__ == '__main__': + argparser = argparse.ArgumentParser() + argparser.add_argument( + '-n', '--file', + help='Input source', default=r'./QuickSort.java') + args = argparser.parse_args() + main(args) diff --git a/HW4-keyvan-dadashzadeh-97522148/Q4/QuickSort.java b/HW4-keyvan-dadashzadeh-97522148/Q4/QuickSort.java new file mode 100644 index 0000000..bed9d46 --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q4/QuickSort.java @@ -0,0 +1,100 @@ + + + +class QuickSort{ + public static void main(String[] a){ + System.out.println(new QS().Start(10)); + } +} +// This class contains the array of integers and +// methods to initialize, print and sort the array +// using Quicksort +class QS{ + int[] number ; + int size ; + // Invoke the Initialization, Sort and Printing + // Methods + public int Start(int sz){ + int aux01 ; + aux01 = this.Init(sz); + aux01 = this.Print(); + System.out.println(9999); + aux01 = size - 1 ; + aux01 = this.Sort(0,aux01); + aux01 = this.Print(); + return 0 ; + } + // Sort array of integers using Quicksort method + public int Sort(int left, int right){ + int v ; + int i ; + int j ; + int nt; + int t ; + boolean cont01; + boolean cont02; + int aux03 ; + t = 0 ; + if (left < right){ + v = number[right] ; + i = left - 1 ; + j = right ; + cont01 = true ; + while (cont01){ + cont02 = true ; + while (cont02){ + i = i + 1 ; + aux03 = number[i] ; + if (!(aux0328n`kP>MrDe3Mv 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 Dk`nUm literal 0 HcmV?d00001 diff --git a/HW4-keyvan-dadashzadeh-97522148/Q4/ast_list.py b/HW4-keyvan-dadashzadeh-97522148/Q4/ast_list.py new file mode 100644 index 0000000..98af773 --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q4/ast_list.py @@ -0,0 +1,207 @@ +import random +import networkx as nx +import matplotlib.pyplot as plt +from networkx.drawing.nx_agraph import graphviz_layout + +from antlr4 import * + +from gen.Q4Listener import Q4Listener +from gen.Q4Parser import Q4Parser + +import queue + +import traceback + + + +class Q4ASTListener(Q4Listener): + def __init__(self): + self.ast = AST() # Data structure for holding the abstract syntax tree + self.q = queue.Queue() # Use to print and visualize AST + self.g = nx.DiGraph() # Use to visualize AST + # self.q.empty() + # print('Q=', ) + + def print_tree(self, node=None, level=1): + if node is None: + return + print() + while node is not None: + current_node = node + print(current_node.value, end='') + if node.child is not None and node.child != "": + self.g.add_edge(current_node, node.child, edge_type='C', color='r') + self.q.put(node.child) + else: + tn = TreeNode(value='▓', child=None, brother=None) + self.g.add_edge(current_node, tn, edge_type='C', color='r') + node = node.brother + if node is not None: + print('\t───\t', end='') + self.g.add_edge(current_node, node, edge_type='B', color='b') + else: + tn = TreeNode(value='▓', child=None, brother=None) + self.g.add_edge(current_node, tn, edge_type='B', color='b') + + if not self.q.empty(): + self.print_tree(node=self.q.get(), level=level+1) + + def print_tresecond(self, node=None): + pass + + # state_terms + def exitState_brace(self, ctx:Q4Parser.State_braceContext): + state_term = self.ast.make_node(value="statements",child=None, brother=None) + subchild = 1 + while subchild < (len(ctx.children)-1): + self.ast.add_child(state_term,ctx.children[subchild].value_attr) + subchild += 1 + ctx.value_attr=state_term + self.ast.root = state_term + self.print_tree(node=self.ast.root, level=1) + + def exitState_if(self, ctx: Q4Parser.State_ifContext): + state_term = self.ast.make_node(value="if",child=None, brother=None) + self.ast.add_child(state_term,ctx.expression().value_attr) + self.ast.add_child(state_term,ctx.st1.value_attr) + + self.prepare_statement(ctx, state_term) + self.prepare_statement(ctx, state_term) + + def exitState_while(self, ctx: Q4Parser.State_whileContext): + state_term = self.ast.make_node(value="while", child=None, brother=None) + self.ast.add_child(state_term, ctx.expression().value_attr) + self.ast.add_child(state_term, ctx.st1.value_attr) + + self.prepare_statement(ctx, state_term) + + def exitState_println(self, ctx: Q4Parser.State_printlnContext): + state_term = self.ast.make_node(value="println", child=None, brother=None) + self.ast.add_child(state_term, ctx.expression().value_attr) + + self.prepare_statement(ctx, state_term) + + def exitState_equal_assign(self, ctx: Q4Parser.State_equal_assignContext): + state_term = self.ast.make_node(value="=", child=None, brother=None) + self.ast.add_child(state_term, ctx.expression().value_attr) + + self.prepare_statement(ctx, state_term) + + + def exitState_access_array_assign(self, ctx: Q4Parser.State_access_array_assignContext): + state_term = self.ast.make_node(value="=", child=None, brother=None) + self.ast.add_child(state_term, ctx.second.value_attr) + self.ast.add_child(ctx.identifier().value_attr, ctx.first.value_attr) + + self.prepare_statement(ctx, state_term) + + def prepare_statement(self, ctx, statement): + ctx.value_attr = statement + self.ast.root = statement + self.print_tree(node=self.ast.root, level=1) + + # exper_terms + def exitIdentifier(self, ctx:Q4Parser.IdentifierContext): + numberPntr = self.ast.make_node(value=ctx.getText(), child=None, brother=None) + ctx.value_attr = numberPntr + + def exitExpr_term_id(self, ctx:Q4Parser.Expr_term_idContext): + ctx.value_attr = ctx.identifier().value_attr + + def exitExpr_term_and(self, ctx: Q4Parser.Expr_term_andContext): + exper_term = self.ast.make_node(value="&&",child=None, brother=None) + self.ast.add_child(exper_term,ctx.first.value_attr) + self.ast.add_child(exper_term,ctx.second.value_attr) + ctx.value_attr = exper_term + + def exitExpr_term_not(self, ctx:Q4Parser.Expr_term_notContext): + exper_term=self.ast.make_node(value="!",child=ctx.expression().value_attr,brother=None) + ctx.value_attr=exper_term + + def exitExpr_term_int(self, ctx:Q4Parser.Expr_term_intContext): + exper_term = self.ast.make_node(value=ctx.INTEGER_LITERAL().getText(),child=None, brother=None) + ctx.value_attr=exper_term + + def exitExpr_term_less(self, ctx: Q4Parser.Expr_term_lessContext): + exper_term = self.ast.make_node(value="<",child=None, brother=None) + self.ast.add_child(exper_term,ctx.first.value_attr) + self.ast.add_child(exper_term,ctx.second.value_attr) + ctx.value_attr = exper_term + + def exitExpr_term_plus(self, ctx:Q4Parser.Expr_term_plusContext): + exper_term = self.ast.make_node(value="+",child=None, brother=None) + self.ast.add_child(exper_term,ctx.first.value_attr) + self.ast.add_child(exper_term,ctx.second.value_attr) + ctx.value_attr = exper_term + + def exitExpr_term_true(self, ctx:Q4Parser.Expr_term_trueContext): + exper_term=self.ast.make_node(value="true",child=None,brother=None) + ctx.value_attr=exper_term + + def exitExpr_term_minus(self, ctx: Q4Parser.Expr_term_minusContext): + exper_term = self.ast.make_node(value="-",child=None, brother=None) + self.ast.add_child(exper_term,ctx.first.value_attr) + self.ast.add_child(exper_term,ctx.second.value_attr) + ctx.value_attr = exper_term + + def exitExpr_term_false(self, ctx:Q4Parser.Expr_term_falseContext): + exper_term = self.ast.make_node(value="false", child=None, brother=None) + ctx.value_attr = exper_term + + def exitExpr_term_paran(self, ctx: Q4Parser.Expr_term_paranContext): + ctx.value_attr = ctx.expression().value_attr + + def exitExpr_term_multiply(self, ctx: Q4Parser.Expr_term_multiplyContext): + exper_term = self.ast.make_node(value="*",child=None, brother=None) + self.ast.add_child(exper_term,ctx.first.value_attr) + self.ast.add_child(exper_term,ctx.second.value_attr) + ctx.value_attr = exper_term + + def exitExpr_term_call_function(self, ctx:Q4Parser.Expr_term_call_functionContext): + exper_term = ctx.identifier().value_attr + i=4 + while i < len(ctx.children)-1: + # print(type(ctx.children[i])) + # print(dir(ctx.children[i])) + # print(ctx.children[i].getText()) + self.ast.add_child(exper_term,ctx.children[i].value_attr) + i+=2 + + ctx.value_attr = exper_term + +class TreeNode: + def __init__(self, value, child, brother): + self.value = value + self.child = child + self.brother = brother + + +class AST: + def __init__(self): + self.root = None + self.current = None + + def make_node(self, value, child, brother): + tree_node = TreeNode(value, child, brother) + self.current = tree_node + return tree_node + + def add_child(self, node, new_child): + if node.child is None: + node.child = new_child + else: + self.current = node.child + while self.current.brother is not None: + self.current = self.current.brother + self.current.brother = new_child + self.current = new_child + + def add_brother(self, node, new_brother): + if node.brother is None: + node.brother = new_brother + else: + self.current = node.brother + while self.current.brother is not None: + self.current = self.current.brother + self.current.brother = new_brother + self.current = new_brother diff --git a/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4.interp b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4.interp new file mode 100644 index 0000000..22fcaba --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4.interp @@ -0,0 +1,102 @@ +token literal names: +null +'class' +'{' +'public' +'static' +'void' +'main' +'(' +'String' +'[' +']' +')' +'}' +'extends' +';' +',' +'return' +'int' +'boolean' +'if' +'else' +'while' +'System.out.println' +'=' +'&&' +'!' +'<' +'+' +'true' +'-' +'false' +'*' +'.' +'this' +'new' +'length' +null +null +null +null +null +null + +token symbolic names: +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +INTEGER_LITERAL +IDENTIFIER +Whitespace +BlockComment +LineComment +Newline + +rule names: +program +mainClass +classDeclaration +varDeclaration +methodDeclaration +type +statement +expression +identifier + + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 43, 231, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 3, 2, 3, 2, 7, 2, 23, 10, 2, 12, 2, 14, 2, 26, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 52, 10, 4, 3, 4, 3, 4, 7, 4, 56, 10, 4, 12, 4, 14, 4, 59, 11, 4, 3, 4, 7, 4, 62, 10, 4, 12, 4, 14, 4, 65, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 83, 10, 6, 12, 6, 14, 6, 86, 11, 6, 5, 6, 88, 10, 6, 3, 6, 3, 6, 3, 6, 7, 6, 93, 10, 6, 12, 6, 14, 6, 96, 11, 6, 3, 6, 7, 6, 99, 10, 6, 12, 6, 14, 6, 102, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 115, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 127, 10, 8, 12, 8, 14, 8, 130, 11, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 158, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 183, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 207, 10, 9, 12, 9, 14, 9, 210, 11, 9, 5, 9, 212, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 224, 10, 9, 12, 9, 14, 9, 227, 11, 9, 3, 10, 3, 10, 3, 10, 2, 3, 16, 11, 2, 4, 6, 8, 10, 12, 14, 16, 18, 2, 2, 2, 256, 2, 20, 3, 2, 2, 2, 4, 29, 3, 2, 2, 2, 6, 47, 3, 2, 2, 2, 8, 68, 3, 2, 2, 2, 10, 72, 3, 2, 2, 2, 12, 114, 3, 2, 2, 2, 14, 157, 3, 2, 2, 2, 16, 182, 3, 2, 2, 2, 18, 228, 3, 2, 2, 2, 20, 24, 5, 4, 3, 2, 21, 23, 5, 6, 4, 2, 22, 21, 3, 2, 2, 2, 23, 26, 3, 2, 2, 2, 24, 22, 3, 2, 2, 2, 24, 25, 3, 2, 2, 2, 25, 27, 3, 2, 2, 2, 26, 24, 3, 2, 2, 2, 27, 28, 7, 2, 2, 3, 28, 3, 3, 2, 2, 2, 29, 30, 7, 3, 2, 2, 30, 31, 5, 18, 10, 2, 31, 32, 7, 4, 2, 2, 32, 33, 7, 5, 2, 2, 33, 34, 7, 6, 2, 2, 34, 35, 7, 7, 2, 2, 35, 36, 7, 8, 2, 2, 36, 37, 7, 9, 2, 2, 37, 38, 7, 10, 2, 2, 38, 39, 7, 11, 2, 2, 39, 40, 7, 12, 2, 2, 40, 41, 5, 18, 10, 2, 41, 42, 7, 13, 2, 2, 42, 43, 7, 4, 2, 2, 43, 44, 5, 14, 8, 2, 44, 45, 7, 14, 2, 2, 45, 46, 7, 14, 2, 2, 46, 5, 3, 2, 2, 2, 47, 48, 7, 3, 2, 2, 48, 51, 5, 18, 10, 2, 49, 50, 7, 15, 2, 2, 50, 52, 5, 18, 10, 2, 51, 49, 3, 2, 2, 2, 51, 52, 3, 2, 2, 2, 52, 53, 3, 2, 2, 2, 53, 57, 7, 4, 2, 2, 54, 56, 5, 8, 5, 2, 55, 54, 3, 2, 2, 2, 56, 59, 3, 2, 2, 2, 57, 55, 3, 2, 2, 2, 57, 58, 3, 2, 2, 2, 58, 63, 3, 2, 2, 2, 59, 57, 3, 2, 2, 2, 60, 62, 5, 10, 6, 2, 61, 60, 3, 2, 2, 2, 62, 65, 3, 2, 2, 2, 63, 61, 3, 2, 2, 2, 63, 64, 3, 2, 2, 2, 64, 66, 3, 2, 2, 2, 65, 63, 3, 2, 2, 2, 66, 67, 7, 14, 2, 2, 67, 7, 3, 2, 2, 2, 68, 69, 5, 12, 7, 2, 69, 70, 5, 18, 10, 2, 70, 71, 7, 16, 2, 2, 71, 9, 3, 2, 2, 2, 72, 73, 7, 5, 2, 2, 73, 74, 5, 12, 7, 2, 74, 75, 5, 18, 10, 2, 75, 87, 7, 9, 2, 2, 76, 77, 5, 12, 7, 2, 77, 84, 5, 18, 10, 2, 78, 79, 7, 17, 2, 2, 79, 80, 5, 12, 7, 2, 80, 81, 5, 18, 10, 2, 81, 83, 3, 2, 2, 2, 82, 78, 3, 2, 2, 2, 83, 86, 3, 2, 2, 2, 84, 82, 3, 2, 2, 2, 84, 85, 3, 2, 2, 2, 85, 88, 3, 2, 2, 2, 86, 84, 3, 2, 2, 2, 87, 76, 3, 2, 2, 2, 87, 88, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 90, 7, 13, 2, 2, 90, 94, 7, 4, 2, 2, 91, 93, 5, 8, 5, 2, 92, 91, 3, 2, 2, 2, 93, 96, 3, 2, 2, 2, 94, 92, 3, 2, 2, 2, 94, 95, 3, 2, 2, 2, 95, 100, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 97, 99, 5, 14, 8, 2, 98, 97, 3, 2, 2, 2, 99, 102, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 100, 101, 3, 2, 2, 2, 101, 103, 3, 2, 2, 2, 102, 100, 3, 2, 2, 2, 103, 104, 7, 18, 2, 2, 104, 105, 5, 16, 9, 2, 105, 106, 7, 16, 2, 2, 106, 107, 7, 14, 2, 2, 107, 11, 3, 2, 2, 2, 108, 109, 7, 19, 2, 2, 109, 110, 7, 11, 2, 2, 110, 115, 7, 12, 2, 2, 111, 115, 7, 20, 2, 2, 112, 115, 7, 19, 2, 2, 113, 115, 5, 18, 10, 2, 114, 108, 3, 2, 2, 2, 114, 111, 3, 2, 2, 2, 114, 112, 3, 2, 2, 2, 114, 113, 3, 2, 2, 2, 115, 13, 3, 2, 2, 2, 116, 117, 7, 21, 2, 2, 117, 118, 7, 9, 2, 2, 118, 119, 5, 16, 9, 2, 119, 120, 7, 13, 2, 2, 120, 121, 5, 14, 8, 2, 121, 122, 7, 22, 2, 2, 122, 123, 5, 14, 8, 2, 123, 158, 3, 2, 2, 2, 124, 128, 7, 4, 2, 2, 125, 127, 5, 14, 8, 2, 126, 125, 3, 2, 2, 2, 127, 130, 3, 2, 2, 2, 128, 126, 3, 2, 2, 2, 128, 129, 3, 2, 2, 2, 129, 131, 3, 2, 2, 2, 130, 128, 3, 2, 2, 2, 131, 158, 7, 14, 2, 2, 132, 133, 7, 23, 2, 2, 133, 134, 7, 9, 2, 2, 134, 135, 5, 16, 9, 2, 135, 136, 7, 13, 2, 2, 136, 137, 5, 14, 8, 2, 137, 158, 3, 2, 2, 2, 138, 139, 7, 24, 2, 2, 139, 140, 7, 9, 2, 2, 140, 141, 5, 16, 9, 2, 141, 142, 7, 13, 2, 2, 142, 143, 7, 16, 2, 2, 143, 158, 3, 2, 2, 2, 144, 145, 5, 18, 10, 2, 145, 146, 7, 25, 2, 2, 146, 147, 5, 16, 9, 2, 147, 148, 7, 16, 2, 2, 148, 158, 3, 2, 2, 2, 149, 150, 5, 18, 10, 2, 150, 151, 7, 11, 2, 2, 151, 152, 5, 16, 9, 2, 152, 153, 7, 12, 2, 2, 153, 154, 7, 25, 2, 2, 154, 155, 5, 16, 9, 2, 155, 156, 7, 16, 2, 2, 156, 158, 3, 2, 2, 2, 157, 116, 3, 2, 2, 2, 157, 124, 3, 2, 2, 2, 157, 132, 3, 2, 2, 2, 157, 138, 3, 2, 2, 2, 157, 144, 3, 2, 2, 2, 157, 149, 3, 2, 2, 2, 158, 15, 3, 2, 2, 2, 159, 160, 8, 9, 1, 2, 160, 183, 5, 18, 10, 2, 161, 162, 7, 27, 2, 2, 162, 183, 5, 16, 9, 17, 163, 183, 7, 38, 2, 2, 164, 183, 7, 30, 2, 2, 165, 183, 7, 32, 2, 2, 166, 167, 7, 9, 2, 2, 167, 168, 5, 16, 9, 2, 168, 169, 7, 13, 2, 2, 169, 183, 3, 2, 2, 2, 170, 183, 7, 35, 2, 2, 171, 172, 7, 36, 2, 2, 172, 173, 7, 19, 2, 2, 173, 174, 7, 11, 2, 2, 174, 175, 5, 16, 9, 2, 175, 176, 7, 12, 2, 2, 176, 183, 3, 2, 2, 2, 177, 178, 7, 36, 2, 2, 178, 179, 5, 18, 10, 2, 179, 180, 7, 9, 2, 2, 180, 181, 7, 13, 2, 2, 181, 183, 3, 2, 2, 2, 182, 159, 3, 2, 2, 2, 182, 161, 3, 2, 2, 2, 182, 163, 3, 2, 2, 2, 182, 164, 3, 2, 2, 2, 182, 165, 3, 2, 2, 2, 182, 166, 3, 2, 2, 2, 182, 170, 3, 2, 2, 2, 182, 171, 3, 2, 2, 2, 182, 177, 3, 2, 2, 2, 183, 225, 3, 2, 2, 2, 184, 185, 12, 18, 2, 2, 185, 186, 7, 26, 2, 2, 186, 224, 5, 16, 9, 19, 187, 188, 12, 15, 2, 2, 188, 189, 7, 28, 2, 2, 189, 224, 5, 16, 9, 16, 190, 191, 12, 14, 2, 2, 191, 192, 7, 29, 2, 2, 192, 224, 5, 16, 9, 15, 193, 194, 12, 12, 2, 2, 194, 195, 7, 31, 2, 2, 195, 224, 5, 16, 9, 13, 196, 197, 12, 9, 2, 2, 197, 198, 7, 33, 2, 2, 198, 224, 5, 16, 9, 10, 199, 200, 12, 8, 2, 2, 200, 201, 7, 34, 2, 2, 201, 202, 5, 18, 10, 2, 202, 211, 7, 9, 2, 2, 203, 208, 5, 16, 9, 2, 204, 205, 7, 17, 2, 2, 205, 207, 5, 16, 9, 2, 206, 204, 3, 2, 2, 2, 207, 210, 3, 2, 2, 2, 208, 206, 3, 2, 2, 2, 208, 209, 3, 2, 2, 2, 209, 212, 3, 2, 2, 2, 210, 208, 3, 2, 2, 2, 211, 203, 3, 2, 2, 2, 211, 212, 3, 2, 2, 2, 212, 213, 3, 2, 2, 2, 213, 214, 7, 13, 2, 2, 214, 224, 3, 2, 2, 2, 215, 216, 12, 4, 2, 2, 216, 217, 7, 11, 2, 2, 217, 218, 5, 16, 9, 2, 218, 219, 7, 12, 2, 2, 219, 224, 3, 2, 2, 2, 220, 221, 12, 3, 2, 2, 221, 222, 7, 34, 2, 2, 222, 224, 7, 37, 2, 2, 223, 184, 3, 2, 2, 2, 223, 187, 3, 2, 2, 2, 223, 190, 3, 2, 2, 2, 223, 193, 3, 2, 2, 2, 223, 196, 3, 2, 2, 2, 223, 199, 3, 2, 2, 2, 223, 215, 3, 2, 2, 2, 223, 220, 3, 2, 2, 2, 224, 227, 3, 2, 2, 2, 225, 223, 3, 2, 2, 2, 225, 226, 3, 2, 2, 2, 226, 17, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 228, 229, 7, 39, 2, 2, 229, 19, 3, 2, 2, 2, 18, 24, 51, 57, 63, 84, 87, 94, 100, 114, 128, 157, 182, 208, 211, 223, 225] \ No newline at end of file diff --git a/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4.tokens b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4.tokens new file mode 100644 index 0000000..c77cdb7 --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4.tokens @@ -0,0 +1,76 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +T__5=6 +T__6=7 +T__7=8 +T__8=9 +T__9=10 +T__10=11 +T__11=12 +T__12=13 +T__13=14 +T__14=15 +T__15=16 +T__16=17 +T__17=18 +T__18=19 +T__19=20 +T__20=21 +T__21=22 +T__22=23 +T__23=24 +T__24=25 +T__25=26 +T__26=27 +T__27=28 +T__28=29 +T__29=30 +T__30=31 +T__31=32 +T__32=33 +T__33=34 +T__34=35 +INTEGER_LITERAL=36 +IDENTIFIER=37 +Whitespace=38 +BlockComment=39 +LineComment=40 +Newline=41 +'class'=1 +'{'=2 +'public'=3 +'static'=4 +'void'=5 +'main'=6 +'('=7 +'String'=8 +'['=9 +']'=10 +')'=11 +'}'=12 +'extends'=13 +';'=14 +','=15 +'return'=16 +'int'=17 +'boolean'=18 +'if'=19 +'else'=20 +'while'=21 +'System.out.println'=22 +'='=23 +'&&'=24 +'!'=25 +'<'=26 +'+'=27 +'true'=28 +'-'=29 +'false'=30 +'*'=31 +'.'=32 +'this'=33 +'new'=34 +'length'=35 diff --git a/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Lexer.interp b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Lexer.interp new file mode 100644 index 0000000..c3f0c01 --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Lexer.interp @@ -0,0 +1,142 @@ +token literal names: +null +'class' +'{' +'public' +'static' +'void' +'main' +'(' +'String' +'[' +']' +')' +'}' +'extends' +';' +',' +'return' +'int' +'boolean' +'if' +'else' +'while' +'System.out.println' +'=' +'&&' +'!' +'<' +'+' +'true' +'-' +'false' +'*' +'.' +'this' +'new' +'length' +null +null +null +null +null +null + +token symbolic names: +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +INTEGER_LITERAL +IDENTIFIER +Whitespace +BlockComment +LineComment +Newline + +rule names: +T__0 +T__1 +T__2 +T__3 +T__4 +T__5 +T__6 +T__7 +T__8 +T__9 +T__10 +T__11 +T__12 +T__13 +T__14 +T__15 +T__16 +T__17 +T__18 +T__19 +T__20 +T__21 +T__22 +T__23 +T__24 +T__25 +T__26 +T__27 +T__28 +T__29 +T__30 +T__31 +T__32 +T__33 +T__34 +INTEGER_LITERAL +IDENTIFIER +LETTER +DIGIT +Whitespace +BlockComment +LineComment +Newline + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 43, 305, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 6, 37, 248, 10, 37, 13, 37, 14, 37, 249, 3, 38, 3, 38, 3, 38, 3, 38, 7, 38, 256, 10, 38, 12, 38, 14, 38, 259, 11, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 6, 41, 266, 10, 41, 13, 41, 14, 41, 267, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 7, 42, 276, 10, 42, 12, 42, 14, 42, 279, 11, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 290, 10, 43, 12, 43, 14, 43, 293, 11, 43, 3, 43, 3, 43, 3, 44, 3, 44, 5, 44, 299, 10, 44, 3, 44, 5, 44, 302, 10, 44, 3, 44, 3, 44, 3, 277, 2, 45, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 2, 79, 2, 81, 40, 83, 41, 85, 42, 87, 43, 3, 2, 6, 4, 2, 67, 92, 99, 124, 3, 2, 50, 59, 4, 2, 11, 11, 34, 34, 4, 2, 12, 12, 15, 15, 2, 311, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 3, 89, 3, 2, 2, 2, 5, 95, 3, 2, 2, 2, 7, 97, 3, 2, 2, 2, 9, 104, 3, 2, 2, 2, 11, 111, 3, 2, 2, 2, 13, 116, 3, 2, 2, 2, 15, 121, 3, 2, 2, 2, 17, 123, 3, 2, 2, 2, 19, 130, 3, 2, 2, 2, 21, 132, 3, 2, 2, 2, 23, 134, 3, 2, 2, 2, 25, 136, 3, 2, 2, 2, 27, 138, 3, 2, 2, 2, 29, 146, 3, 2, 2, 2, 31, 148, 3, 2, 2, 2, 33, 150, 3, 2, 2, 2, 35, 157, 3, 2, 2, 2, 37, 161, 3, 2, 2, 2, 39, 169, 3, 2, 2, 2, 41, 172, 3, 2, 2, 2, 43, 177, 3, 2, 2, 2, 45, 183, 3, 2, 2, 2, 47, 202, 3, 2, 2, 2, 49, 204, 3, 2, 2, 2, 51, 207, 3, 2, 2, 2, 53, 209, 3, 2, 2, 2, 55, 211, 3, 2, 2, 2, 57, 213, 3, 2, 2, 2, 59, 218, 3, 2, 2, 2, 61, 220, 3, 2, 2, 2, 63, 226, 3, 2, 2, 2, 65, 228, 3, 2, 2, 2, 67, 230, 3, 2, 2, 2, 69, 235, 3, 2, 2, 2, 71, 239, 3, 2, 2, 2, 73, 247, 3, 2, 2, 2, 75, 251, 3, 2, 2, 2, 77, 260, 3, 2, 2, 2, 79, 262, 3, 2, 2, 2, 81, 265, 3, 2, 2, 2, 83, 271, 3, 2, 2, 2, 85, 285, 3, 2, 2, 2, 87, 301, 3, 2, 2, 2, 89, 90, 7, 101, 2, 2, 90, 91, 7, 110, 2, 2, 91, 92, 7, 99, 2, 2, 92, 93, 7, 117, 2, 2, 93, 94, 7, 117, 2, 2, 94, 4, 3, 2, 2, 2, 95, 96, 7, 125, 2, 2, 96, 6, 3, 2, 2, 2, 97, 98, 7, 114, 2, 2, 98, 99, 7, 119, 2, 2, 99, 100, 7, 100, 2, 2, 100, 101, 7, 110, 2, 2, 101, 102, 7, 107, 2, 2, 102, 103, 7, 101, 2, 2, 103, 8, 3, 2, 2, 2, 104, 105, 7, 117, 2, 2, 105, 106, 7, 118, 2, 2, 106, 107, 7, 99, 2, 2, 107, 108, 7, 118, 2, 2, 108, 109, 7, 107, 2, 2, 109, 110, 7, 101, 2, 2, 110, 10, 3, 2, 2, 2, 111, 112, 7, 120, 2, 2, 112, 113, 7, 113, 2, 2, 113, 114, 7, 107, 2, 2, 114, 115, 7, 102, 2, 2, 115, 12, 3, 2, 2, 2, 116, 117, 7, 111, 2, 2, 117, 118, 7, 99, 2, 2, 118, 119, 7, 107, 2, 2, 119, 120, 7, 112, 2, 2, 120, 14, 3, 2, 2, 2, 121, 122, 7, 42, 2, 2, 122, 16, 3, 2, 2, 2, 123, 124, 7, 85, 2, 2, 124, 125, 7, 118, 2, 2, 125, 126, 7, 116, 2, 2, 126, 127, 7, 107, 2, 2, 127, 128, 7, 112, 2, 2, 128, 129, 7, 105, 2, 2, 129, 18, 3, 2, 2, 2, 130, 131, 7, 93, 2, 2, 131, 20, 3, 2, 2, 2, 132, 133, 7, 95, 2, 2, 133, 22, 3, 2, 2, 2, 134, 135, 7, 43, 2, 2, 135, 24, 3, 2, 2, 2, 136, 137, 7, 127, 2, 2, 137, 26, 3, 2, 2, 2, 138, 139, 7, 103, 2, 2, 139, 140, 7, 122, 2, 2, 140, 141, 7, 118, 2, 2, 141, 142, 7, 103, 2, 2, 142, 143, 7, 112, 2, 2, 143, 144, 7, 102, 2, 2, 144, 145, 7, 117, 2, 2, 145, 28, 3, 2, 2, 2, 146, 147, 7, 61, 2, 2, 147, 30, 3, 2, 2, 2, 148, 149, 7, 46, 2, 2, 149, 32, 3, 2, 2, 2, 150, 151, 7, 116, 2, 2, 151, 152, 7, 103, 2, 2, 152, 153, 7, 118, 2, 2, 153, 154, 7, 119, 2, 2, 154, 155, 7, 116, 2, 2, 155, 156, 7, 112, 2, 2, 156, 34, 3, 2, 2, 2, 157, 158, 7, 107, 2, 2, 158, 159, 7, 112, 2, 2, 159, 160, 7, 118, 2, 2, 160, 36, 3, 2, 2, 2, 161, 162, 7, 100, 2, 2, 162, 163, 7, 113, 2, 2, 163, 164, 7, 113, 2, 2, 164, 165, 7, 110, 2, 2, 165, 166, 7, 103, 2, 2, 166, 167, 7, 99, 2, 2, 167, 168, 7, 112, 2, 2, 168, 38, 3, 2, 2, 2, 169, 170, 7, 107, 2, 2, 170, 171, 7, 104, 2, 2, 171, 40, 3, 2, 2, 2, 172, 173, 7, 103, 2, 2, 173, 174, 7, 110, 2, 2, 174, 175, 7, 117, 2, 2, 175, 176, 7, 103, 2, 2, 176, 42, 3, 2, 2, 2, 177, 178, 7, 121, 2, 2, 178, 179, 7, 106, 2, 2, 179, 180, 7, 107, 2, 2, 180, 181, 7, 110, 2, 2, 181, 182, 7, 103, 2, 2, 182, 44, 3, 2, 2, 2, 183, 184, 7, 85, 2, 2, 184, 185, 7, 123, 2, 2, 185, 186, 7, 117, 2, 2, 186, 187, 7, 118, 2, 2, 187, 188, 7, 103, 2, 2, 188, 189, 7, 111, 2, 2, 189, 190, 7, 48, 2, 2, 190, 191, 7, 113, 2, 2, 191, 192, 7, 119, 2, 2, 192, 193, 7, 118, 2, 2, 193, 194, 7, 48, 2, 2, 194, 195, 7, 114, 2, 2, 195, 196, 7, 116, 2, 2, 196, 197, 7, 107, 2, 2, 197, 198, 7, 112, 2, 2, 198, 199, 7, 118, 2, 2, 199, 200, 7, 110, 2, 2, 200, 201, 7, 112, 2, 2, 201, 46, 3, 2, 2, 2, 202, 203, 7, 63, 2, 2, 203, 48, 3, 2, 2, 2, 204, 205, 7, 40, 2, 2, 205, 206, 7, 40, 2, 2, 206, 50, 3, 2, 2, 2, 207, 208, 7, 35, 2, 2, 208, 52, 3, 2, 2, 2, 209, 210, 7, 62, 2, 2, 210, 54, 3, 2, 2, 2, 211, 212, 7, 45, 2, 2, 212, 56, 3, 2, 2, 2, 213, 214, 7, 118, 2, 2, 214, 215, 7, 116, 2, 2, 215, 216, 7, 119, 2, 2, 216, 217, 7, 103, 2, 2, 217, 58, 3, 2, 2, 2, 218, 219, 7, 47, 2, 2, 219, 60, 3, 2, 2, 2, 220, 221, 7, 104, 2, 2, 221, 222, 7, 99, 2, 2, 222, 223, 7, 110, 2, 2, 223, 224, 7, 117, 2, 2, 224, 225, 7, 103, 2, 2, 225, 62, 3, 2, 2, 2, 226, 227, 7, 44, 2, 2, 227, 64, 3, 2, 2, 2, 228, 229, 7, 48, 2, 2, 229, 66, 3, 2, 2, 2, 230, 231, 7, 118, 2, 2, 231, 232, 7, 106, 2, 2, 232, 233, 7, 107, 2, 2, 233, 234, 7, 117, 2, 2, 234, 68, 3, 2, 2, 2, 235, 236, 7, 112, 2, 2, 236, 237, 7, 103, 2, 2, 237, 238, 7, 121, 2, 2, 238, 70, 3, 2, 2, 2, 239, 240, 7, 110, 2, 2, 240, 241, 7, 103, 2, 2, 241, 242, 7, 112, 2, 2, 242, 243, 7, 105, 2, 2, 243, 244, 7, 118, 2, 2, 244, 245, 7, 106, 2, 2, 245, 72, 3, 2, 2, 2, 246, 248, 5, 79, 40, 2, 247, 246, 3, 2, 2, 2, 248, 249, 3, 2, 2, 2, 249, 247, 3, 2, 2, 2, 249, 250, 3, 2, 2, 2, 250, 74, 3, 2, 2, 2, 251, 257, 5, 77, 39, 2, 252, 256, 5, 77, 39, 2, 253, 256, 7, 97, 2, 2, 254, 256, 5, 79, 40, 2, 255, 252, 3, 2, 2, 2, 255, 253, 3, 2, 2, 2, 255, 254, 3, 2, 2, 2, 256, 259, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 258, 3, 2, 2, 2, 258, 76, 3, 2, 2, 2, 259, 257, 3, 2, 2, 2, 260, 261, 9, 2, 2, 2, 261, 78, 3, 2, 2, 2, 262, 263, 9, 3, 2, 2, 263, 80, 3, 2, 2, 2, 264, 266, 9, 4, 2, 2, 265, 264, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 270, 8, 41, 2, 2, 270, 82, 3, 2, 2, 2, 271, 272, 7, 49, 2, 2, 272, 273, 7, 44, 2, 2, 273, 277, 3, 2, 2, 2, 274, 276, 11, 2, 2, 2, 275, 274, 3, 2, 2, 2, 276, 279, 3, 2, 2, 2, 277, 278, 3, 2, 2, 2, 277, 275, 3, 2, 2, 2, 278, 280, 3, 2, 2, 2, 279, 277, 3, 2, 2, 2, 280, 281, 7, 44, 2, 2, 281, 282, 7, 49, 2, 2, 282, 283, 3, 2, 2, 2, 283, 284, 8, 42, 2, 2, 284, 84, 3, 2, 2, 2, 285, 286, 7, 49, 2, 2, 286, 287, 7, 49, 2, 2, 287, 291, 3, 2, 2, 2, 288, 290, 10, 5, 2, 2, 289, 288, 3, 2, 2, 2, 290, 293, 3, 2, 2, 2, 291, 289, 3, 2, 2, 2, 291, 292, 3, 2, 2, 2, 292, 294, 3, 2, 2, 2, 293, 291, 3, 2, 2, 2, 294, 295, 8, 43, 2, 2, 295, 86, 3, 2, 2, 2, 296, 298, 7, 15, 2, 2, 297, 299, 7, 12, 2, 2, 298, 297, 3, 2, 2, 2, 298, 299, 3, 2, 2, 2, 299, 302, 3, 2, 2, 2, 300, 302, 7, 12, 2, 2, 301, 296, 3, 2, 2, 2, 301, 300, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 303, 304, 8, 44, 2, 2, 304, 88, 3, 2, 2, 2, 11, 2, 249, 255, 257, 267, 277, 291, 298, 301, 3, 8, 2, 2] \ No newline at end of file diff --git a/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Lexer.py b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Lexer.py new file mode 100644 index 0000000..00df632 --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Lexer.py @@ -0,0 +1,219 @@ +# Generated from Q4.g4 by ANTLR 4.9 +from antlr4 import * +from io import StringIO +from typing.io import TextIO +import sys + + + +def serializedATN(): + with StringIO() as buf: + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2+") + buf.write("\u0131\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") + buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r") + buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") + buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") + buf.write("\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36") + buf.write("\t\36\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%") + buf.write("\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4,\t,\3\2\3\2\3") + buf.write("\2\3\2\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5") + buf.write("\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3") + buf.write("\7\3\7\3\7\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n") + buf.write("\3\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3") + buf.write("\16\3\16\3\16\3\17\3\17\3\20\3\20\3\21\3\21\3\21\3\21") + buf.write("\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23") + buf.write("\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\25\3\25\3\25\3\25") + buf.write("\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27") + buf.write("\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27") + buf.write("\3\27\3\27\3\27\3\27\3\30\3\30\3\31\3\31\3\31\3\32\3\32") + buf.write("\3\33\3\33\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\36\3\36") + buf.write("\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3!\3!\3\"\3\"\3\"") + buf.write("\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%\6%\u00f8") + buf.write("\n%\r%\16%\u00f9\3&\3&\3&\3&\7&\u0100\n&\f&\16&\u0103") + buf.write("\13&\3\'\3\'\3(\3(\3)\6)\u010a\n)\r)\16)\u010b\3)\3)\3") + buf.write("*\3*\3*\3*\7*\u0114\n*\f*\16*\u0117\13*\3*\3*\3*\3*\3") + buf.write("*\3+\3+\3+\3+\7+\u0122\n+\f+\16+\u0125\13+\3+\3+\3,\3") + buf.write(",\5,\u012b\n,\3,\5,\u012e\n,\3,\3,\3\u0115\2-\3\3\5\4") + buf.write("\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17") + buf.write("\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63") + buf.write("\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M\2O\2Q(S)U*") + buf.write("W+\3\2\6\4\2C\\c|\3\2\62;\4\2\13\13\"\"\4\2\f\f\17\17") + buf.write("\2\u0137\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2") + buf.write("\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2") + buf.write("\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2") + buf.write("\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3") + buf.write("\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2") + buf.write("-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3") + buf.write("\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2") + buf.write("?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2") + buf.write("\2I\3\2\2\2\2K\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2") + buf.write("\2\2W\3\2\2\2\3Y\3\2\2\2\5_\3\2\2\2\7a\3\2\2\2\th\3\2") + buf.write("\2\2\13o\3\2\2\2\rt\3\2\2\2\17y\3\2\2\2\21{\3\2\2\2\23") + buf.write("\u0082\3\2\2\2\25\u0084\3\2\2\2\27\u0086\3\2\2\2\31\u0088") + buf.write("\3\2\2\2\33\u008a\3\2\2\2\35\u0092\3\2\2\2\37\u0094\3") + buf.write("\2\2\2!\u0096\3\2\2\2#\u009d\3\2\2\2%\u00a1\3\2\2\2\'") + buf.write("\u00a9\3\2\2\2)\u00ac\3\2\2\2+\u00b1\3\2\2\2-\u00b7\3") + buf.write("\2\2\2/\u00ca\3\2\2\2\61\u00cc\3\2\2\2\63\u00cf\3\2\2") + buf.write("\2\65\u00d1\3\2\2\2\67\u00d3\3\2\2\29\u00d5\3\2\2\2;\u00da") + buf.write("\3\2\2\2=\u00dc\3\2\2\2?\u00e2\3\2\2\2A\u00e4\3\2\2\2") + buf.write("C\u00e6\3\2\2\2E\u00eb\3\2\2\2G\u00ef\3\2\2\2I\u00f7\3") + buf.write("\2\2\2K\u00fb\3\2\2\2M\u0104\3\2\2\2O\u0106\3\2\2\2Q\u0109") + buf.write("\3\2\2\2S\u010f\3\2\2\2U\u011d\3\2\2\2W\u012d\3\2\2\2") + buf.write("YZ\7e\2\2Z[\7n\2\2[\\\7c\2\2\\]\7u\2\2]^\7u\2\2^\4\3\2") + buf.write("\2\2_`\7}\2\2`\6\3\2\2\2ab\7r\2\2bc\7w\2\2cd\7d\2\2de") + buf.write("\7n\2\2ef\7k\2\2fg\7e\2\2g\b\3\2\2\2hi\7u\2\2ij\7v\2\2") + buf.write("jk\7c\2\2kl\7v\2\2lm\7k\2\2mn\7e\2\2n\n\3\2\2\2op\7x\2") + buf.write("\2pq\7q\2\2qr\7k\2\2rs\7f\2\2s\f\3\2\2\2tu\7o\2\2uv\7") + buf.write("c\2\2vw\7k\2\2wx\7p\2\2x\16\3\2\2\2yz\7*\2\2z\20\3\2\2") + buf.write("\2{|\7U\2\2|}\7v\2\2}~\7t\2\2~\177\7k\2\2\177\u0080\7") + buf.write("p\2\2\u0080\u0081\7i\2\2\u0081\22\3\2\2\2\u0082\u0083") + buf.write("\7]\2\2\u0083\24\3\2\2\2\u0084\u0085\7_\2\2\u0085\26\3") + buf.write("\2\2\2\u0086\u0087\7+\2\2\u0087\30\3\2\2\2\u0088\u0089") + buf.write("\7\177\2\2\u0089\32\3\2\2\2\u008a\u008b\7g\2\2\u008b\u008c") + buf.write("\7z\2\2\u008c\u008d\7v\2\2\u008d\u008e\7g\2\2\u008e\u008f") + buf.write("\7p\2\2\u008f\u0090\7f\2\2\u0090\u0091\7u\2\2\u0091\34") + buf.write("\3\2\2\2\u0092\u0093\7=\2\2\u0093\36\3\2\2\2\u0094\u0095") + buf.write("\7.\2\2\u0095 \3\2\2\2\u0096\u0097\7t\2\2\u0097\u0098") + buf.write("\7g\2\2\u0098\u0099\7v\2\2\u0099\u009a\7w\2\2\u009a\u009b") + buf.write("\7t\2\2\u009b\u009c\7p\2\2\u009c\"\3\2\2\2\u009d\u009e") + buf.write("\7k\2\2\u009e\u009f\7p\2\2\u009f\u00a0\7v\2\2\u00a0$\3") + buf.write("\2\2\2\u00a1\u00a2\7d\2\2\u00a2\u00a3\7q\2\2\u00a3\u00a4") + buf.write("\7q\2\2\u00a4\u00a5\7n\2\2\u00a5\u00a6\7g\2\2\u00a6\u00a7") + buf.write("\7c\2\2\u00a7\u00a8\7p\2\2\u00a8&\3\2\2\2\u00a9\u00aa") + buf.write("\7k\2\2\u00aa\u00ab\7h\2\2\u00ab(\3\2\2\2\u00ac\u00ad") + buf.write("\7g\2\2\u00ad\u00ae\7n\2\2\u00ae\u00af\7u\2\2\u00af\u00b0") + buf.write("\7g\2\2\u00b0*\3\2\2\2\u00b1\u00b2\7y\2\2\u00b2\u00b3") + buf.write("\7j\2\2\u00b3\u00b4\7k\2\2\u00b4\u00b5\7n\2\2\u00b5\u00b6") + buf.write("\7g\2\2\u00b6,\3\2\2\2\u00b7\u00b8\7U\2\2\u00b8\u00b9") + buf.write("\7{\2\2\u00b9\u00ba\7u\2\2\u00ba\u00bb\7v\2\2\u00bb\u00bc") + buf.write("\7g\2\2\u00bc\u00bd\7o\2\2\u00bd\u00be\7\60\2\2\u00be") + buf.write("\u00bf\7q\2\2\u00bf\u00c0\7w\2\2\u00c0\u00c1\7v\2\2\u00c1") + buf.write("\u00c2\7\60\2\2\u00c2\u00c3\7r\2\2\u00c3\u00c4\7t\2\2") + buf.write("\u00c4\u00c5\7k\2\2\u00c5\u00c6\7p\2\2\u00c6\u00c7\7v") + buf.write("\2\2\u00c7\u00c8\7n\2\2\u00c8\u00c9\7p\2\2\u00c9.\3\2") + buf.write("\2\2\u00ca\u00cb\7?\2\2\u00cb\60\3\2\2\2\u00cc\u00cd\7") + buf.write("(\2\2\u00cd\u00ce\7(\2\2\u00ce\62\3\2\2\2\u00cf\u00d0") + buf.write("\7#\2\2\u00d0\64\3\2\2\2\u00d1\u00d2\7>\2\2\u00d2\66\3") + buf.write("\2\2\2\u00d3\u00d4\7-\2\2\u00d48\3\2\2\2\u00d5\u00d6\7") + buf.write("v\2\2\u00d6\u00d7\7t\2\2\u00d7\u00d8\7w\2\2\u00d8\u00d9") + buf.write("\7g\2\2\u00d9:\3\2\2\2\u00da\u00db\7/\2\2\u00db<\3\2\2") + buf.write("\2\u00dc\u00dd\7h\2\2\u00dd\u00de\7c\2\2\u00de\u00df\7") + buf.write("n\2\2\u00df\u00e0\7u\2\2\u00e0\u00e1\7g\2\2\u00e1>\3\2") + buf.write("\2\2\u00e2\u00e3\7,\2\2\u00e3@\3\2\2\2\u00e4\u00e5\7\60") + buf.write("\2\2\u00e5B\3\2\2\2\u00e6\u00e7\7v\2\2\u00e7\u00e8\7j") + buf.write("\2\2\u00e8\u00e9\7k\2\2\u00e9\u00ea\7u\2\2\u00eaD\3\2") + buf.write("\2\2\u00eb\u00ec\7p\2\2\u00ec\u00ed\7g\2\2\u00ed\u00ee") + buf.write("\7y\2\2\u00eeF\3\2\2\2\u00ef\u00f0\7n\2\2\u00f0\u00f1") + buf.write("\7g\2\2\u00f1\u00f2\7p\2\2\u00f2\u00f3\7i\2\2\u00f3\u00f4") + buf.write("\7v\2\2\u00f4\u00f5\7j\2\2\u00f5H\3\2\2\2\u00f6\u00f8") + buf.write("\5O(\2\u00f7\u00f6\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00f7") + buf.write("\3\2\2\2\u00f9\u00fa\3\2\2\2\u00faJ\3\2\2\2\u00fb\u0101") + buf.write("\5M\'\2\u00fc\u0100\5M\'\2\u00fd\u0100\7a\2\2\u00fe\u0100") + buf.write("\5O(\2\u00ff\u00fc\3\2\2\2\u00ff\u00fd\3\2\2\2\u00ff\u00fe") + buf.write("\3\2\2\2\u0100\u0103\3\2\2\2\u0101\u00ff\3\2\2\2\u0101") + buf.write("\u0102\3\2\2\2\u0102L\3\2\2\2\u0103\u0101\3\2\2\2\u0104") + buf.write("\u0105\t\2\2\2\u0105N\3\2\2\2\u0106\u0107\t\3\2\2\u0107") + buf.write("P\3\2\2\2\u0108\u010a\t\4\2\2\u0109\u0108\3\2\2\2\u010a") + buf.write("\u010b\3\2\2\2\u010b\u0109\3\2\2\2\u010b\u010c\3\2\2\2") + buf.write("\u010c\u010d\3\2\2\2\u010d\u010e\b)\2\2\u010eR\3\2\2\2") + buf.write("\u010f\u0110\7\61\2\2\u0110\u0111\7,\2\2\u0111\u0115\3") + buf.write("\2\2\2\u0112\u0114\13\2\2\2\u0113\u0112\3\2\2\2\u0114") + buf.write("\u0117\3\2\2\2\u0115\u0116\3\2\2\2\u0115\u0113\3\2\2\2") + buf.write("\u0116\u0118\3\2\2\2\u0117\u0115\3\2\2\2\u0118\u0119\7") + buf.write(",\2\2\u0119\u011a\7\61\2\2\u011a\u011b\3\2\2\2\u011b\u011c") + buf.write("\b*\2\2\u011cT\3\2\2\2\u011d\u011e\7\61\2\2\u011e\u011f") + buf.write("\7\61\2\2\u011f\u0123\3\2\2\2\u0120\u0122\n\5\2\2\u0121") + buf.write("\u0120\3\2\2\2\u0122\u0125\3\2\2\2\u0123\u0121\3\2\2\2") + buf.write("\u0123\u0124\3\2\2\2\u0124\u0126\3\2\2\2\u0125\u0123\3") + buf.write("\2\2\2\u0126\u0127\b+\2\2\u0127V\3\2\2\2\u0128\u012a\7") + buf.write("\17\2\2\u0129\u012b\7\f\2\2\u012a\u0129\3\2\2\2\u012a") + buf.write("\u012b\3\2\2\2\u012b\u012e\3\2\2\2\u012c\u012e\7\f\2\2") + buf.write("\u012d\u0128\3\2\2\2\u012d\u012c\3\2\2\2\u012e\u012f\3") + buf.write("\2\2\2\u012f\u0130\b,\2\2\u0130X\3\2\2\2\13\2\u00f9\u00ff") + buf.write("\u0101\u010b\u0115\u0123\u012a\u012d\3\b\2\2") + return buf.getvalue() + + +class Q4Lexer(Lexer): + + atn = ATNDeserializer().deserialize(serializedATN()) + + decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] + + T__0 = 1 + T__1 = 2 + T__2 = 3 + T__3 = 4 + T__4 = 5 + T__5 = 6 + T__6 = 7 + T__7 = 8 + T__8 = 9 + T__9 = 10 + T__10 = 11 + T__11 = 12 + T__12 = 13 + T__13 = 14 + T__14 = 15 + T__15 = 16 + T__16 = 17 + T__17 = 18 + T__18 = 19 + T__19 = 20 + T__20 = 21 + T__21 = 22 + T__22 = 23 + T__23 = 24 + T__24 = 25 + T__25 = 26 + T__26 = 27 + T__27 = 28 + T__28 = 29 + T__29 = 30 + T__30 = 31 + T__31 = 32 + T__32 = 33 + T__33 = 34 + T__34 = 35 + INTEGER_LITERAL = 36 + IDENTIFIER = 37 + Whitespace = 38 + BlockComment = 39 + LineComment = 40 + Newline = 41 + + channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] + + modeNames = [ "DEFAULT_MODE" ] + + literalNames = [ "", + "'class'", "'{'", "'public'", "'static'", "'void'", "'main'", + "'('", "'String'", "'['", "']'", "')'", "'}'", "'extends'", + "';'", "','", "'return'", "'int'", "'boolean'", "'if'", "'else'", + "'while'", "'System.out.println'", "'='", "'&&'", "'!'", "'<'", + "'+'", "'true'", "'-'", "'false'", "'*'", "'.'", "'this'", "'new'", + "'length'" ] + + symbolicNames = [ "", + "INTEGER_LITERAL", "IDENTIFIER", "Whitespace", "BlockComment", + "LineComment", "Newline" ] + + ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", + "T__7", "T__8", "T__9", "T__10", "T__11", "T__12", "T__13", + "T__14", "T__15", "T__16", "T__17", "T__18", "T__19", + "T__20", "T__21", "T__22", "T__23", "T__24", "T__25", + "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", + "T__32", "T__33", "T__34", "INTEGER_LITERAL", "IDENTIFIER", + "LETTER", "DIGIT", "Whitespace", "BlockComment", "LineComment", + "Newline" ] + + grammarFileName = "Q4.g4" + + def __init__(self, input=None, output:TextIO = sys.stdout): + super().__init__(input, output) + self.checkVersion("4.9") + self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache()) + self._actions = None + self._predicates = None + + diff --git a/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Lexer.tokens b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Lexer.tokens new file mode 100644 index 0000000..c77cdb7 --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Lexer.tokens @@ -0,0 +1,76 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +T__5=6 +T__6=7 +T__7=8 +T__8=9 +T__9=10 +T__10=11 +T__11=12 +T__12=13 +T__13=14 +T__14=15 +T__15=16 +T__16=17 +T__17=18 +T__18=19 +T__19=20 +T__20=21 +T__21=22 +T__22=23 +T__23=24 +T__24=25 +T__25=26 +T__26=27 +T__27=28 +T__28=29 +T__29=30 +T__30=31 +T__31=32 +T__32=33 +T__33=34 +T__34=35 +INTEGER_LITERAL=36 +IDENTIFIER=37 +Whitespace=38 +BlockComment=39 +LineComment=40 +Newline=41 +'class'=1 +'{'=2 +'public'=3 +'static'=4 +'void'=5 +'main'=6 +'('=7 +'String'=8 +'['=9 +']'=10 +')'=11 +'}'=12 +'extends'=13 +';'=14 +','=15 +'return'=16 +'int'=17 +'boolean'=18 +'if'=19 +'else'=20 +'while'=21 +'System.out.println'=22 +'='=23 +'&&'=24 +'!'=25 +'<'=26 +'+'=27 +'true'=28 +'-'=29 +'false'=30 +'*'=31 +'.'=32 +'this'=33 +'new'=34 +'length'=35 diff --git a/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Listener.py b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Listener.py new file mode 100644 index 0000000..b019c67 --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Listener.py @@ -0,0 +1,282 @@ +# Generated from Q4.g4 by ANTLR 4.9 +from antlr4 import * +if __name__ is not None and "." in __name__: + from .Q4Parser import Q4Parser +else: + from Q4Parser import Q4Parser + +# This class defines a complete listener for a parse tree produced by Q4Parser. +class Q4Listener(ParseTreeListener): + + # Enter a parse tree produced by Q4Parser#program. + def enterProgram(self, ctx:Q4Parser.ProgramContext): + pass + + # Exit a parse tree produced by Q4Parser#program. + def exitProgram(self, ctx:Q4Parser.ProgramContext): + pass + + + # Enter a parse tree produced by Q4Parser#mainClass. + def enterMainClass(self, ctx:Q4Parser.MainClassContext): + pass + + # Exit a parse tree produced by Q4Parser#mainClass. + def exitMainClass(self, ctx:Q4Parser.MainClassContext): + pass + + + # Enter a parse tree produced by Q4Parser#classDeclaration. + def enterClassDeclaration(self, ctx:Q4Parser.ClassDeclarationContext): + pass + + # Exit a parse tree produced by Q4Parser#classDeclaration. + def exitClassDeclaration(self, ctx:Q4Parser.ClassDeclarationContext): + pass + + + # Enter a parse tree produced by Q4Parser#varDeclaration. + def enterVarDeclaration(self, ctx:Q4Parser.VarDeclarationContext): + pass + + # Exit a parse tree produced by Q4Parser#varDeclaration. + def exitVarDeclaration(self, ctx:Q4Parser.VarDeclarationContext): + pass + + + # Enter a parse tree produced by Q4Parser#methodDeclaration. + def enterMethodDeclaration(self, ctx:Q4Parser.MethodDeclarationContext): + pass + + # Exit a parse tree produced by Q4Parser#methodDeclaration. + def exitMethodDeclaration(self, ctx:Q4Parser.MethodDeclarationContext): + pass + + + # Enter a parse tree produced by Q4Parser#type. + def enterType(self, ctx:Q4Parser.TypeContext): + pass + + # Exit a parse tree produced by Q4Parser#type. + def exitType(self, ctx:Q4Parser.TypeContext): + pass + + + # Enter a parse tree produced by Q4Parser#state_if. + def enterState_if(self, ctx:Q4Parser.State_ifContext): + pass + + # Exit a parse tree produced by Q4Parser#state_if. + def exitState_if(self, ctx:Q4Parser.State_ifContext): + pass + + + # Enter a parse tree produced by Q4Parser#state_brace. + def enterState_brace(self, ctx:Q4Parser.State_braceContext): + pass + + # Exit a parse tree produced by Q4Parser#state_brace. + def exitState_brace(self, ctx:Q4Parser.State_braceContext): + pass + + + # Enter a parse tree produced by Q4Parser#state_while. + def enterState_while(self, ctx:Q4Parser.State_whileContext): + pass + + # Exit a parse tree produced by Q4Parser#state_while. + def exitState_while(self, ctx:Q4Parser.State_whileContext): + pass + + + # Enter a parse tree produced by Q4Parser#state_println. + def enterState_println(self, ctx:Q4Parser.State_printlnContext): + pass + + # Exit a parse tree produced by Q4Parser#state_println. + def exitState_println(self, ctx:Q4Parser.State_printlnContext): + pass + + + # Enter a parse tree produced by Q4Parser#state_equal_assign. + def enterState_equal_assign(self, ctx:Q4Parser.State_equal_assignContext): + pass + + # Exit a parse tree produced by Q4Parser#state_equal_assign. + def exitState_equal_assign(self, ctx:Q4Parser.State_equal_assignContext): + pass + + + # Enter a parse tree produced by Q4Parser#state_access_array_assign. + def enterState_access_array_assign(self, ctx:Q4Parser.State_access_array_assignContext): + pass + + # Exit a parse tree produced by Q4Parser#state_access_array_assign. + def exitState_access_array_assign(self, ctx:Q4Parser.State_access_array_assignContext): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_useless_4. + def enterExpr_term_useless_4(self, ctx:Q4Parser.Expr_term_useless_4Context): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_useless_4. + def exitExpr_term_useless_4(self, ctx:Q4Parser.Expr_term_useless_4Context): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_useless_5. + def enterExpr_term_useless_5(self, ctx:Q4Parser.Expr_term_useless_5Context): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_useless_5. + def exitExpr_term_useless_5(self, ctx:Q4Parser.Expr_term_useless_5Context): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_useless_2. + def enterExpr_term_useless_2(self, ctx:Q4Parser.Expr_term_useless_2Context): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_useless_2. + def exitExpr_term_useless_2(self, ctx:Q4Parser.Expr_term_useless_2Context): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_useless_3. + def enterExpr_term_useless_3(self, ctx:Q4Parser.Expr_term_useless_3Context): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_useless_3. + def exitExpr_term_useless_3(self, ctx:Q4Parser.Expr_term_useless_3Context): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_useless_1. + def enterExpr_term_useless_1(self, ctx:Q4Parser.Expr_term_useless_1Context): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_useless_1. + def exitExpr_term_useless_1(self, ctx:Q4Parser.Expr_term_useless_1Context): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_plus. + def enterExpr_term_plus(self, ctx:Q4Parser.Expr_term_plusContext): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_plus. + def exitExpr_term_plus(self, ctx:Q4Parser.Expr_term_plusContext): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_false. + def enterExpr_term_false(self, ctx:Q4Parser.Expr_term_falseContext): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_false. + def exitExpr_term_false(self, ctx:Q4Parser.Expr_term_falseContext): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_less. + def enterExpr_term_less(self, ctx:Q4Parser.Expr_term_lessContext): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_less. + def exitExpr_term_less(self, ctx:Q4Parser.Expr_term_lessContext): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_minus. + def enterExpr_term_minus(self, ctx:Q4Parser.Expr_term_minusContext): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_minus. + def exitExpr_term_minus(self, ctx:Q4Parser.Expr_term_minusContext): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_int. + def enterExpr_term_int(self, ctx:Q4Parser.Expr_term_intContext): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_int. + def exitExpr_term_int(self, ctx:Q4Parser.Expr_term_intContext): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_paran. + def enterExpr_term_paran(self, ctx:Q4Parser.Expr_term_paranContext): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_paran. + def exitExpr_term_paran(self, ctx:Q4Parser.Expr_term_paranContext): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_true. + def enterExpr_term_true(self, ctx:Q4Parser.Expr_term_trueContext): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_true. + def exitExpr_term_true(self, ctx:Q4Parser.Expr_term_trueContext): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_not. + def enterExpr_term_not(self, ctx:Q4Parser.Expr_term_notContext): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_not. + def exitExpr_term_not(self, ctx:Q4Parser.Expr_term_notContext): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_call_function. + def enterExpr_term_call_function(self, ctx:Q4Parser.Expr_term_call_functionContext): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_call_function. + def exitExpr_term_call_function(self, ctx:Q4Parser.Expr_term_call_functionContext): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_id. + def enterExpr_term_id(self, ctx:Q4Parser.Expr_term_idContext): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_id. + def exitExpr_term_id(self, ctx:Q4Parser.Expr_term_idContext): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_and. + def enterExpr_term_and(self, ctx:Q4Parser.Expr_term_andContext): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_and. + def exitExpr_term_and(self, ctx:Q4Parser.Expr_term_andContext): + pass + + + # Enter a parse tree produced by Q4Parser#expr_term_multiply. + def enterExpr_term_multiply(self, ctx:Q4Parser.Expr_term_multiplyContext): + pass + + # Exit a parse tree produced by Q4Parser#expr_term_multiply. + def exitExpr_term_multiply(self, ctx:Q4Parser.Expr_term_multiplyContext): + pass + + + # Enter a parse tree produced by Q4Parser#identifier. + def enterIdentifier(self, ctx:Q4Parser.IdentifierContext): + pass + + # Exit a parse tree produced by Q4Parser#identifier. + def exitIdentifier(self, ctx:Q4Parser.IdentifierContext): + pass + + + +del Q4Parser \ No newline at end of file diff --git a/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Parser.py b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Parser.py new file mode 100644 index 0000000..39e39cd --- /dev/null +++ b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/Q4Parser.py @@ -0,0 +1,1715 @@ +# Generated from Q4.g4 by ANTLR 4.9 +# encoding: utf-8 +from antlr4 import * +from io import StringIO +import sys +if sys.version_info[1] > 5: + from typing import TextIO +else: + from typing.io import TextIO + + +def serializedATN(): + with StringIO() as buf: + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3+") + buf.write("\u00e7\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\3\2\3\2\7\2\27\n\2\f\2\16\2\32") + buf.write("\13\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3") + buf.write("\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\5\4\64") + buf.write("\n\4\3\4\3\4\7\48\n\4\f\4\16\4;\13\4\3\4\7\4>\n\4\f\4") + buf.write("\16\4A\13\4\3\4\3\4\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3") + buf.write("\6\3\6\3\6\3\6\3\6\3\6\7\6S\n\6\f\6\16\6V\13\6\5\6X\n") + buf.write("\6\3\6\3\6\3\6\7\6]\n\6\f\6\16\6`\13\6\3\6\7\6c\n\6\f") + buf.write("\6\16\6f\13\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7") + buf.write("\3\7\5\7s\n\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b") + buf.write("\7\b\177\n\b\f\b\16\b\u0082\13\b\3\b\3\b\3\b\3\b\3\b\3") + buf.write("\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b") + buf.write("\3\b\3\b\3\b\3\b\3\b\3\b\3\b\5\b\u009e\n\b\3\t\3\t\3\t") + buf.write("\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3") + buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u00b7\n\t\3\t\3\t\3\t\3") + buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\3\t\3\t\3\t\3\t\3\t\7\t\u00cf\n\t\f\t\16\t\u00d2\13\t") + buf.write("\5\t\u00d4\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\7\t\u00e0\n\t\f\t\16\t\u00e3\13\t\3\n\3\n\3\n\2\3\20") + buf.write("\13\2\4\6\b\n\f\16\20\22\2\2\2\u0100\2\24\3\2\2\2\4\35") + buf.write("\3\2\2\2\6/\3\2\2\2\bD\3\2\2\2\nH\3\2\2\2\fr\3\2\2\2\16") + buf.write("\u009d\3\2\2\2\20\u00b6\3\2\2\2\22\u00e4\3\2\2\2\24\30") + buf.write("\5\4\3\2\25\27\5\6\4\2\26\25\3\2\2\2\27\32\3\2\2\2\30") + buf.write("\26\3\2\2\2\30\31\3\2\2\2\31\33\3\2\2\2\32\30\3\2\2\2") + buf.write("\33\34\7\2\2\3\34\3\3\2\2\2\35\36\7\3\2\2\36\37\5\22\n") + buf.write("\2\37 \7\4\2\2 !\7\5\2\2!\"\7\6\2\2\"#\7\7\2\2#$\7\b\2") + buf.write("\2$%\7\t\2\2%&\7\n\2\2&\'\7\13\2\2\'(\7\f\2\2()\5\22\n") + buf.write("\2)*\7\r\2\2*+\7\4\2\2+,\5\16\b\2,-\7\16\2\2-.\7\16\2") + buf.write("\2.\5\3\2\2\2/\60\7\3\2\2\60\63\5\22\n\2\61\62\7\17\2") + buf.write("\2\62\64\5\22\n\2\63\61\3\2\2\2\63\64\3\2\2\2\64\65\3") + buf.write("\2\2\2\659\7\4\2\2\668\5\b\5\2\67\66\3\2\2\28;\3\2\2\2") + buf.write("9\67\3\2\2\29:\3\2\2\2:?\3\2\2\2;9\3\2\2\2<>\5\n\6\2=") + buf.write("<\3\2\2\2>A\3\2\2\2?=\3\2\2\2?@\3\2\2\2@B\3\2\2\2A?\3") + buf.write("\2\2\2BC\7\16\2\2C\7\3\2\2\2DE\5\f\7\2EF\5\22\n\2FG\7") + buf.write("\20\2\2G\t\3\2\2\2HI\7\5\2\2IJ\5\f\7\2JK\5\22\n\2KW\7") + buf.write("\t\2\2LM\5\f\7\2MT\5\22\n\2NO\7\21\2\2OP\5\f\7\2PQ\5\22") + buf.write("\n\2QS\3\2\2\2RN\3\2\2\2SV\3\2\2\2TR\3\2\2\2TU\3\2\2\2") + buf.write("UX\3\2\2\2VT\3\2\2\2WL\3\2\2\2WX\3\2\2\2XY\3\2\2\2YZ\7") + buf.write("\r\2\2Z^\7\4\2\2[]\5\b\5\2\\[\3\2\2\2]`\3\2\2\2^\\\3\2") + buf.write("\2\2^_\3\2\2\2_d\3\2\2\2`^\3\2\2\2ac\5\16\b\2ba\3\2\2") + buf.write("\2cf\3\2\2\2db\3\2\2\2de\3\2\2\2eg\3\2\2\2fd\3\2\2\2g") + buf.write("h\7\22\2\2hi\5\20\t\2ij\7\20\2\2jk\7\16\2\2k\13\3\2\2") + buf.write("\2lm\7\23\2\2mn\7\13\2\2ns\7\f\2\2os\7\24\2\2ps\7\23\2") + buf.write("\2qs\5\22\n\2rl\3\2\2\2ro\3\2\2\2rp\3\2\2\2rq\3\2\2\2") + buf.write("s\r\3\2\2\2tu\7\25\2\2uv\7\t\2\2vw\5\20\t\2wx\7\r\2\2") + buf.write("xy\5\16\b\2yz\7\26\2\2z{\5\16\b\2{\u009e\3\2\2\2|\u0080") + buf.write("\7\4\2\2}\177\5\16\b\2~}\3\2\2\2\177\u0082\3\2\2\2\u0080") + buf.write("~\3\2\2\2\u0080\u0081\3\2\2\2\u0081\u0083\3\2\2\2\u0082") + buf.write("\u0080\3\2\2\2\u0083\u009e\7\16\2\2\u0084\u0085\7\27\2") + buf.write("\2\u0085\u0086\7\t\2\2\u0086\u0087\5\20\t\2\u0087\u0088") + buf.write("\7\r\2\2\u0088\u0089\5\16\b\2\u0089\u009e\3\2\2\2\u008a") + buf.write("\u008b\7\30\2\2\u008b\u008c\7\t\2\2\u008c\u008d\5\20\t") + buf.write("\2\u008d\u008e\7\r\2\2\u008e\u008f\7\20\2\2\u008f\u009e") + buf.write("\3\2\2\2\u0090\u0091\5\22\n\2\u0091\u0092\7\31\2\2\u0092") + buf.write("\u0093\5\20\t\2\u0093\u0094\7\20\2\2\u0094\u009e\3\2\2") + buf.write("\2\u0095\u0096\5\22\n\2\u0096\u0097\7\13\2\2\u0097\u0098") + buf.write("\5\20\t\2\u0098\u0099\7\f\2\2\u0099\u009a\7\31\2\2\u009a") + buf.write("\u009b\5\20\t\2\u009b\u009c\7\20\2\2\u009c\u009e\3\2\2") + buf.write("\2\u009dt\3\2\2\2\u009d|\3\2\2\2\u009d\u0084\3\2\2\2\u009d") + buf.write("\u008a\3\2\2\2\u009d\u0090\3\2\2\2\u009d\u0095\3\2\2\2") + buf.write("\u009e\17\3\2\2\2\u009f\u00a0\b\t\1\2\u00a0\u00b7\5\22") + buf.write("\n\2\u00a1\u00a2\7\33\2\2\u00a2\u00b7\5\20\t\21\u00a3") + buf.write("\u00b7\7&\2\2\u00a4\u00b7\7\36\2\2\u00a5\u00b7\7 \2\2") + buf.write("\u00a6\u00a7\7\t\2\2\u00a7\u00a8\5\20\t\2\u00a8\u00a9") + buf.write("\7\r\2\2\u00a9\u00b7\3\2\2\2\u00aa\u00b7\7#\2\2\u00ab") + buf.write("\u00ac\7$\2\2\u00ac\u00ad\7\23\2\2\u00ad\u00ae\7\13\2") + buf.write("\2\u00ae\u00af\5\20\t\2\u00af\u00b0\7\f\2\2\u00b0\u00b7") + buf.write("\3\2\2\2\u00b1\u00b2\7$\2\2\u00b2\u00b3\5\22\n\2\u00b3") + buf.write("\u00b4\7\t\2\2\u00b4\u00b5\7\r\2\2\u00b5\u00b7\3\2\2\2") + buf.write("\u00b6\u009f\3\2\2\2\u00b6\u00a1\3\2\2\2\u00b6\u00a3\3") + buf.write("\2\2\2\u00b6\u00a4\3\2\2\2\u00b6\u00a5\3\2\2\2\u00b6\u00a6") + buf.write("\3\2\2\2\u00b6\u00aa\3\2\2\2\u00b6\u00ab\3\2\2\2\u00b6") + buf.write("\u00b1\3\2\2\2\u00b7\u00e1\3\2\2\2\u00b8\u00b9\f\22\2") + buf.write("\2\u00b9\u00ba\7\32\2\2\u00ba\u00e0\5\20\t\23\u00bb\u00bc") + buf.write("\f\17\2\2\u00bc\u00bd\7\34\2\2\u00bd\u00e0\5\20\t\20\u00be") + buf.write("\u00bf\f\16\2\2\u00bf\u00c0\7\35\2\2\u00c0\u00e0\5\20") + buf.write("\t\17\u00c1\u00c2\f\f\2\2\u00c2\u00c3\7\37\2\2\u00c3\u00e0") + buf.write("\5\20\t\r\u00c4\u00c5\f\t\2\2\u00c5\u00c6\7!\2\2\u00c6") + buf.write("\u00e0\5\20\t\n\u00c7\u00c8\f\b\2\2\u00c8\u00c9\7\"\2") + buf.write("\2\u00c9\u00ca\5\22\n\2\u00ca\u00d3\7\t\2\2\u00cb\u00d0") + buf.write("\5\20\t\2\u00cc\u00cd\7\21\2\2\u00cd\u00cf\5\20\t\2\u00ce") + buf.write("\u00cc\3\2\2\2\u00cf\u00d2\3\2\2\2\u00d0\u00ce\3\2\2\2") + buf.write("\u00d0\u00d1\3\2\2\2\u00d1\u00d4\3\2\2\2\u00d2\u00d0\3") + buf.write("\2\2\2\u00d3\u00cb\3\2\2\2\u00d3\u00d4\3\2\2\2\u00d4\u00d5") + buf.write("\3\2\2\2\u00d5\u00d6\7\r\2\2\u00d6\u00e0\3\2\2\2\u00d7") + buf.write("\u00d8\f\4\2\2\u00d8\u00d9\7\13\2\2\u00d9\u00da\5\20\t") + buf.write("\2\u00da\u00db\7\f\2\2\u00db\u00e0\3\2\2\2\u00dc\u00dd") + buf.write("\f\3\2\2\u00dd\u00de\7\"\2\2\u00de\u00e0\7%\2\2\u00df") + buf.write("\u00b8\3\2\2\2\u00df\u00bb\3\2\2\2\u00df\u00be\3\2\2\2") + buf.write("\u00df\u00c1\3\2\2\2\u00df\u00c4\3\2\2\2\u00df\u00c7\3") + buf.write("\2\2\2\u00df\u00d7\3\2\2\2\u00df\u00dc\3\2\2\2\u00e0\u00e3") + buf.write("\3\2\2\2\u00e1\u00df\3\2\2\2\u00e1\u00e2\3\2\2\2\u00e2") + buf.write("\21\3\2\2\2\u00e3\u00e1\3\2\2\2\u00e4\u00e5\7\'\2\2\u00e5") + buf.write("\23\3\2\2\2\22\30\639?TW^dr\u0080\u009d\u00b6\u00d0\u00d3") + buf.write("\u00df\u00e1") + return buf.getvalue() + + +class Q4Parser ( Parser ): + + grammarFileName = "Q4.g4" + + atn = ATNDeserializer().deserialize(serializedATN()) + + decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] + + sharedContextCache = PredictionContextCache() + + literalNames = [ "", "'class'", "'{'", "'public'", "'static'", + "'void'", "'main'", "'('", "'String'", "'['", "']'", + "')'", "'}'", "'extends'", "';'", "','", "'return'", + "'int'", "'boolean'", "'if'", "'else'", "'while'", + "'System.out.println'", "'='", "'&&'", "'!'", "'<'", + "'+'", "'true'", "'-'", "'false'", "'*'", "'.'", "'this'", + "'new'", "'length'" ] + + symbolicNames = [ "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "INTEGER_LITERAL", "IDENTIFIER", "Whitespace", "BlockComment", + "LineComment", "Newline" ] + + RULE_program = 0 + RULE_mainClass = 1 + RULE_classDeclaration = 2 + RULE_varDeclaration = 3 + RULE_methodDeclaration = 4 + RULE_type = 5 + RULE_statement = 6 + RULE_expression = 7 + RULE_identifier = 8 + + ruleNames = [ "program", "mainClass", "classDeclaration", "varDeclaration", + "methodDeclaration", "type", "statement", "expression", + "identifier" ] + + EOF = Token.EOF + T__0=1 + T__1=2 + T__2=3 + T__3=4 + T__4=5 + T__5=6 + T__6=7 + T__7=8 + T__8=9 + T__9=10 + T__10=11 + T__11=12 + T__12=13 + T__13=14 + T__14=15 + T__15=16 + T__16=17 + T__17=18 + T__18=19 + T__19=20 + T__20=21 + T__21=22 + T__22=23 + T__23=24 + T__24=25 + T__25=26 + T__26=27 + T__27=28 + T__28=29 + T__29=30 + T__30=31 + T__31=32 + T__32=33 + T__33=34 + T__34=35 + INTEGER_LITERAL=36 + IDENTIFIER=37 + Whitespace=38 + BlockComment=39 + LineComment=40 + Newline=41 + + def __init__(self, input:TokenStream, output:TextIO = sys.stdout): + super().__init__(input, output) + self.checkVersion("4.9") + self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) + self._predicates = None + + + + + class ProgramContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def mainClass(self): + return self.getTypedRuleContext(Q4Parser.MainClassContext,0) + + + def EOF(self): + return self.getToken(Q4Parser.EOF, 0) + + def classDeclaration(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.ClassDeclarationContext) + else: + return self.getTypedRuleContext(Q4Parser.ClassDeclarationContext,i) + + + def getRuleIndex(self): + return Q4Parser.RULE_program + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterProgram" ): + listener.enterProgram(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitProgram" ): + listener.exitProgram(self) + + + + + def program(self): + + localctx = Q4Parser.ProgramContext(self, self._ctx, self.state) + self.enterRule(localctx, 0, self.RULE_program) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 18 + self.mainClass() + self.state = 22 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==Q4Parser.T__0: + self.state = 19 + self.classDeclaration() + self.state = 24 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 25 + self.match(Q4Parser.EOF) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MainClassContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def identifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.IdentifierContext) + else: + return self.getTypedRuleContext(Q4Parser.IdentifierContext,i) + + + def statement(self): + return self.getTypedRuleContext(Q4Parser.StatementContext,0) + + + def getRuleIndex(self): + return Q4Parser.RULE_mainClass + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMainClass" ): + listener.enterMainClass(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMainClass" ): + listener.exitMainClass(self) + + + + + def mainClass(self): + + localctx = Q4Parser.MainClassContext(self, self._ctx, self.state) + self.enterRule(localctx, 2, self.RULE_mainClass) + try: + self.enterOuterAlt(localctx, 1) + self.state = 27 + self.match(Q4Parser.T__0) + self.state = 28 + self.identifier() + self.state = 29 + self.match(Q4Parser.T__1) + self.state = 30 + self.match(Q4Parser.T__2) + self.state = 31 + self.match(Q4Parser.T__3) + self.state = 32 + self.match(Q4Parser.T__4) + self.state = 33 + self.match(Q4Parser.T__5) + self.state = 34 + self.match(Q4Parser.T__6) + self.state = 35 + self.match(Q4Parser.T__7) + self.state = 36 + self.match(Q4Parser.T__8) + self.state = 37 + self.match(Q4Parser.T__9) + self.state = 38 + self.identifier() + self.state = 39 + self.match(Q4Parser.T__10) + self.state = 40 + self.match(Q4Parser.T__1) + self.state = 41 + self.statement() + self.state = 42 + self.match(Q4Parser.T__11) + self.state = 43 + self.match(Q4Parser.T__11) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ClassDeclarationContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.id1 = None # IdentifierContext + + def identifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.IdentifierContext) + else: + return self.getTypedRuleContext(Q4Parser.IdentifierContext,i) + + + def varDeclaration(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.VarDeclarationContext) + else: + return self.getTypedRuleContext(Q4Parser.VarDeclarationContext,i) + + + def methodDeclaration(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.MethodDeclarationContext) + else: + return self.getTypedRuleContext(Q4Parser.MethodDeclarationContext,i) + + + def getRuleIndex(self): + return Q4Parser.RULE_classDeclaration + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterClassDeclaration" ): + listener.enterClassDeclaration(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitClassDeclaration" ): + listener.exitClassDeclaration(self) + + + + + def classDeclaration(self): + + localctx = Q4Parser.ClassDeclarationContext(self, self._ctx, self.state) + self.enterRule(localctx, 4, self.RULE_classDeclaration) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 45 + self.match(Q4Parser.T__0) + self.state = 46 + localctx.id1 = self.identifier() + self.state = 49 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==Q4Parser.T__12: + self.state = 47 + self.match(Q4Parser.T__12) + self.state = 48 + self.identifier() + + + self.state = 51 + self.match(Q4Parser.T__1) + self.state = 55 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << Q4Parser.T__16) | (1 << Q4Parser.T__17) | (1 << Q4Parser.IDENTIFIER))) != 0): + self.state = 52 + self.varDeclaration() + self.state = 57 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 61 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==Q4Parser.T__2: + self.state = 58 + self.methodDeclaration() + self.state = 63 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 64 + self.match(Q4Parser.T__11) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class VarDeclarationContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def type(self): + return self.getTypedRuleContext(Q4Parser.TypeContext,0) + + + def identifier(self): + return self.getTypedRuleContext(Q4Parser.IdentifierContext,0) + + + def getRuleIndex(self): + return Q4Parser.RULE_varDeclaration + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterVarDeclaration" ): + listener.enterVarDeclaration(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitVarDeclaration" ): + listener.exitVarDeclaration(self) + + + + + def varDeclaration(self): + + localctx = Q4Parser.VarDeclarationContext(self, self._ctx, self.state) + self.enterRule(localctx, 6, self.RULE_varDeclaration) + try: + self.enterOuterAlt(localctx, 1) + self.state = 66 + self.type() + self.state = 67 + self.identifier() + self.state = 68 + self.match(Q4Parser.T__13) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodDeclarationContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.id1 = None # IdentifierContext + self.id2 = None # IdentifierContext + self.id3 = None # IdentifierContext + + def type(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.TypeContext) + else: + return self.getTypedRuleContext(Q4Parser.TypeContext,i) + + + def expression(self): + return self.getTypedRuleContext(Q4Parser.ExpressionContext,0) + + + def identifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.IdentifierContext) + else: + return self.getTypedRuleContext(Q4Parser.IdentifierContext,i) + + + def varDeclaration(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.VarDeclarationContext) + else: + return self.getTypedRuleContext(Q4Parser.VarDeclarationContext,i) + + + def statement(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.StatementContext) + else: + return self.getTypedRuleContext(Q4Parser.StatementContext,i) + + + def getRuleIndex(self): + return Q4Parser.RULE_methodDeclaration + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMethodDeclaration" ): + listener.enterMethodDeclaration(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMethodDeclaration" ): + listener.exitMethodDeclaration(self) + + + + + def methodDeclaration(self): + + localctx = Q4Parser.MethodDeclarationContext(self, self._ctx, self.state) + self.enterRule(localctx, 8, self.RULE_methodDeclaration) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 70 + self.match(Q4Parser.T__2) + self.state = 71 + self.type() + self.state = 72 + localctx.id1 = self.identifier() + self.state = 73 + self.match(Q4Parser.T__6) + self.state = 85 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << Q4Parser.T__16) | (1 << Q4Parser.T__17) | (1 << Q4Parser.IDENTIFIER))) != 0): + self.state = 74 + self.type() + self.state = 75 + localctx.id2 = self.identifier() + self.state = 82 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==Q4Parser.T__14: + self.state = 76 + self.match(Q4Parser.T__14) + self.state = 77 + self.type() + self.state = 78 + localctx.id3 = self.identifier() + self.state = 84 + self._errHandler.sync(self) + _la = self._input.LA(1) + + + + self.state = 87 + self.match(Q4Parser.T__10) + self.state = 88 + self.match(Q4Parser.T__1) + self.state = 92 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,6,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 89 + self.varDeclaration() + self.state = 94 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,6,self._ctx) + + self.state = 98 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << Q4Parser.T__1) | (1 << Q4Parser.T__18) | (1 << Q4Parser.T__20) | (1 << Q4Parser.T__21) | (1 << Q4Parser.IDENTIFIER))) != 0): + self.state = 95 + self.statement() + self.state = 100 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 101 + self.match(Q4Parser.T__15) + self.state = 102 + self.expression(0) + self.state = 103 + self.match(Q4Parser.T__13) + self.state = 104 + self.match(Q4Parser.T__11) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class TypeContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def identifier(self): + return self.getTypedRuleContext(Q4Parser.IdentifierContext,0) + + + def getRuleIndex(self): + return Q4Parser.RULE_type + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterType" ): + listener.enterType(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitType" ): + listener.exitType(self) + + + + + def type(self): + + localctx = Q4Parser.TypeContext(self, self._ctx, self.state) + self.enterRule(localctx, 10, self.RULE_type) + try: + self.state = 112 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,8,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 106 + self.match(Q4Parser.T__16) + self.state = 107 + self.match(Q4Parser.T__8) + self.state = 108 + self.match(Q4Parser.T__9) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 109 + self.match(Q4Parser.T__17) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 110 + self.match(Q4Parser.T__16) + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 111 + self.identifier() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class StatementContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.value_attr = str() + self.type_attr = str() + + + def getRuleIndex(self): + return Q4Parser.RULE_statement + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + self.value_attr = ctx.value_attr + self.type_attr = ctx.type_attr + + + + class State_equal_assignContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def identifier(self): + return self.getTypedRuleContext(Q4Parser.IdentifierContext,0) + + def expression(self): + return self.getTypedRuleContext(Q4Parser.ExpressionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterState_equal_assign" ): + listener.enterState_equal_assign(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitState_equal_assign" ): + listener.exitState_equal_assign(self) + + + class State_access_array_assignContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.StatementContext + super().__init__(parser) + self.first = None # ExpressionContext + self.second = None # ExpressionContext + self.copyFrom(ctx) + + def identifier(self): + return self.getTypedRuleContext(Q4Parser.IdentifierContext,0) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.ExpressionContext) + else: + return self.getTypedRuleContext(Q4Parser.ExpressionContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterState_access_array_assign" ): + listener.enterState_access_array_assign(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitState_access_array_assign" ): + listener.exitState_access_array_assign(self) + + + class State_braceContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def statement(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.StatementContext) + else: + return self.getTypedRuleContext(Q4Parser.StatementContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterState_brace" ): + listener.enterState_brace(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitState_brace" ): + listener.exitState_brace(self) + + + class State_printlnContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def expression(self): + return self.getTypedRuleContext(Q4Parser.ExpressionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterState_println" ): + listener.enterState_println(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitState_println" ): + listener.exitState_println(self) + + + class State_ifContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.StatementContext + super().__init__(parser) + self.st1 = None # StatementContext + self.st2 = None # StatementContext + self.copyFrom(ctx) + + def expression(self): + return self.getTypedRuleContext(Q4Parser.ExpressionContext,0) + + def statement(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.StatementContext) + else: + return self.getTypedRuleContext(Q4Parser.StatementContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterState_if" ): + listener.enterState_if(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitState_if" ): + listener.exitState_if(self) + + + class State_whileContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.StatementContext + super().__init__(parser) + self.st1 = None # StatementContext + self.copyFrom(ctx) + + def expression(self): + return self.getTypedRuleContext(Q4Parser.ExpressionContext,0) + + def statement(self): + return self.getTypedRuleContext(Q4Parser.StatementContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterState_while" ): + listener.enterState_while(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitState_while" ): + listener.exitState_while(self) + + + + def statement(self): + + localctx = Q4Parser.StatementContext(self, self._ctx, self.state) + self.enterRule(localctx, 12, self.RULE_statement) + self._la = 0 # Token type + try: + self.state = 155 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,10,self._ctx) + if la_ == 1: + localctx = Q4Parser.State_ifContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 114 + self.match(Q4Parser.T__18) + self.state = 115 + self.match(Q4Parser.T__6) + self.state = 116 + self.expression(0) + self.state = 117 + self.match(Q4Parser.T__10) + self.state = 118 + localctx.st1 = self.statement() + self.state = 119 + self.match(Q4Parser.T__19) + self.state = 120 + localctx.st2 = self.statement() + pass + + elif la_ == 2: + localctx = Q4Parser.State_braceContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 122 + self.match(Q4Parser.T__1) + self.state = 126 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << Q4Parser.T__1) | (1 << Q4Parser.T__18) | (1 << Q4Parser.T__20) | (1 << Q4Parser.T__21) | (1 << Q4Parser.IDENTIFIER))) != 0): + self.state = 123 + self.statement() + self.state = 128 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 129 + self.match(Q4Parser.T__11) + pass + + elif la_ == 3: + localctx = Q4Parser.State_whileContext(self, localctx) + self.enterOuterAlt(localctx, 3) + self.state = 130 + self.match(Q4Parser.T__20) + self.state = 131 + self.match(Q4Parser.T__6) + self.state = 132 + self.expression(0) + self.state = 133 + self.match(Q4Parser.T__10) + self.state = 134 + localctx.st1 = self.statement() + pass + + elif la_ == 4: + localctx = Q4Parser.State_printlnContext(self, localctx) + self.enterOuterAlt(localctx, 4) + self.state = 136 + self.match(Q4Parser.T__21) + self.state = 137 + self.match(Q4Parser.T__6) + self.state = 138 + self.expression(0) + self.state = 139 + self.match(Q4Parser.T__10) + self.state = 140 + self.match(Q4Parser.T__13) + pass + + elif la_ == 5: + localctx = Q4Parser.State_equal_assignContext(self, localctx) + self.enterOuterAlt(localctx, 5) + self.state = 142 + self.identifier() + self.state = 143 + self.match(Q4Parser.T__22) + self.state = 144 + self.expression(0) + self.state = 145 + self.match(Q4Parser.T__13) + pass + + elif la_ == 6: + localctx = Q4Parser.State_access_array_assignContext(self, localctx) + self.enterOuterAlt(localctx, 6) + self.state = 147 + self.identifier() + self.state = 148 + self.match(Q4Parser.T__8) + self.state = 149 + localctx.first = self.expression(0) + self.state = 150 + self.match(Q4Parser.T__9) + self.state = 151 + self.match(Q4Parser.T__22) + self.state = 152 + localctx.second = self.expression(0) + self.state = 153 + self.match(Q4Parser.T__13) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ExpressionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.value_attr = str() + self.type_attr = str() + + + def getRuleIndex(self): + return Q4Parser.RULE_expression + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + self.value_attr = ctx.value_attr + self.type_attr = ctx.type_attr + + + class Expr_term_useless_4Context(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.first = None # ExpressionContext + self.second = None # ExpressionContext + self.copyFrom(ctx) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.ExpressionContext) + else: + return self.getTypedRuleContext(Q4Parser.ExpressionContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_useless_4" ): + listener.enterExpr_term_useless_4(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_useless_4" ): + listener.exitExpr_term_useless_4(self) + + + class Expr_term_useless_5Context(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def expression(self): + return self.getTypedRuleContext(Q4Parser.ExpressionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_useless_5" ): + listener.enterExpr_term_useless_5(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_useless_5" ): + listener.exitExpr_term_useless_5(self) + + + class Expr_term_useless_2Context(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def expression(self): + return self.getTypedRuleContext(Q4Parser.ExpressionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_useless_2" ): + listener.enterExpr_term_useless_2(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_useless_2" ): + listener.exitExpr_term_useless_2(self) + + + class Expr_term_useless_3Context(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def identifier(self): + return self.getTypedRuleContext(Q4Parser.IdentifierContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_useless_3" ): + listener.enterExpr_term_useless_3(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_useless_3" ): + listener.exitExpr_term_useless_3(self) + + + class Expr_term_useless_1Context(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_useless_1" ): + listener.enterExpr_term_useless_1(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_useless_1" ): + listener.exitExpr_term_useless_1(self) + + + class Expr_term_plusContext(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.first = None # ExpressionContext + self.second = None # ExpressionContext + self.copyFrom(ctx) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.ExpressionContext) + else: + return self.getTypedRuleContext(Q4Parser.ExpressionContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_plus" ): + listener.enterExpr_term_plus(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_plus" ): + listener.exitExpr_term_plus(self) + + + class Expr_term_falseContext(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_false" ): + listener.enterExpr_term_false(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_false" ): + listener.exitExpr_term_false(self) + + + class Expr_term_lessContext(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.first = None # ExpressionContext + self.second = None # ExpressionContext + self.copyFrom(ctx) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.ExpressionContext) + else: + return self.getTypedRuleContext(Q4Parser.ExpressionContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_less" ): + listener.enterExpr_term_less(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_less" ): + listener.exitExpr_term_less(self) + + + class Expr_term_minusContext(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.first = None # ExpressionContext + self.second = None # ExpressionContext + self.copyFrom(ctx) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.ExpressionContext) + else: + return self.getTypedRuleContext(Q4Parser.ExpressionContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_minus" ): + listener.enterExpr_term_minus(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_minus" ): + listener.exitExpr_term_minus(self) + + + class Expr_term_intContext(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def INTEGER_LITERAL(self): + return self.getToken(Q4Parser.INTEGER_LITERAL, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_int" ): + listener.enterExpr_term_int(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_int" ): + listener.exitExpr_term_int(self) + + + class Expr_term_paranContext(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def expression(self): + return self.getTypedRuleContext(Q4Parser.ExpressionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_paran" ): + listener.enterExpr_term_paran(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_paran" ): + listener.exitExpr_term_paran(self) + + + class Expr_term_trueContext(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_true" ): + listener.enterExpr_term_true(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_true" ): + listener.exitExpr_term_true(self) + + + class Expr_term_notContext(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def expression(self): + return self.getTypedRuleContext(Q4Parser.ExpressionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_not" ): + listener.enterExpr_term_not(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_not" ): + listener.exitExpr_term_not(self) + + + class Expr_term_call_functionContext(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.first = None # ExpressionContext + self.id = None # IdentifierContext + self.second = None # ExpressionContext + self.copyFrom(ctx) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.ExpressionContext) + else: + return self.getTypedRuleContext(Q4Parser.ExpressionContext,i) + + def identifier(self): + return self.getTypedRuleContext(Q4Parser.IdentifierContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_call_function" ): + listener.enterExpr_term_call_function(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_call_function" ): + listener.exitExpr_term_call_function(self) + + + class Expr_term_idContext(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.id = None # IdentifierContext + self.copyFrom(ctx) + + def identifier(self): + return self.getTypedRuleContext(Q4Parser.IdentifierContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_id" ): + listener.enterExpr_term_id(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_id" ): + listener.exitExpr_term_id(self) + + + class Expr_term_andContext(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.first = None # ExpressionContext + self.second = None # ExpressionContext + self.copyFrom(ctx) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.ExpressionContext) + else: + return self.getTypedRuleContext(Q4Parser.ExpressionContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_and" ): + listener.enterExpr_term_and(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_and" ): + listener.exitExpr_term_and(self) + + + class Expr_term_multiplyContext(ExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a Q4Parser.ExpressionContext + super().__init__(parser) + self.first = None # ExpressionContext + self.second = None # ExpressionContext + self.copyFrom(ctx) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(Q4Parser.ExpressionContext) + else: + return self.getTypedRuleContext(Q4Parser.ExpressionContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr_term_multiply" ): + listener.enterExpr_term_multiply(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr_term_multiply" ): + listener.exitExpr_term_multiply(self) + + + + def expression(self, _p:int=0): + _parentctx = self._ctx + _parentState = self.state + localctx = Q4Parser.ExpressionContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 14 + self.enterRecursionRule(localctx, 14, self.RULE_expression, _p) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 180 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,11,self._ctx) + if la_ == 1: + localctx = Q4Parser.Expr_term_idContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + + self.state = 158 + localctx.id = self.identifier() + pass + + elif la_ == 2: + localctx = Q4Parser.Expr_term_notContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 159 + self.match(Q4Parser.T__24) + self.state = 160 + self.expression(15) + pass + + elif la_ == 3: + localctx = Q4Parser.Expr_term_intContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 161 + self.match(Q4Parser.INTEGER_LITERAL) + pass + + elif la_ == 4: + localctx = Q4Parser.Expr_term_trueContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 162 + self.match(Q4Parser.T__27) + pass + + elif la_ == 5: + localctx = Q4Parser.Expr_term_falseContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 163 + self.match(Q4Parser.T__29) + pass + + elif la_ == 6: + localctx = Q4Parser.Expr_term_paranContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 164 + self.match(Q4Parser.T__6) + self.state = 165 + self.expression(0) + self.state = 166 + self.match(Q4Parser.T__10) + pass + + elif la_ == 7: + localctx = Q4Parser.Expr_term_useless_1Context(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 168 + self.match(Q4Parser.T__32) + pass + + elif la_ == 8: + localctx = Q4Parser.Expr_term_useless_2Context(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 169 + self.match(Q4Parser.T__33) + self.state = 170 + self.match(Q4Parser.T__16) + self.state = 171 + self.match(Q4Parser.T__8) + self.state = 172 + self.expression(0) + self.state = 173 + self.match(Q4Parser.T__9) + pass + + elif la_ == 9: + localctx = Q4Parser.Expr_term_useless_3Context(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 175 + self.match(Q4Parser.T__33) + self.state = 176 + self.identifier() + self.state = 177 + self.match(Q4Parser.T__6) + self.state = 178 + self.match(Q4Parser.T__10) + pass + + + self._ctx.stop = self._input.LT(-1) + self.state = 223 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,15,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + self.state = 221 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,14,self._ctx) + if la_ == 1: + localctx = Q4Parser.Expr_term_andContext(self, Q4Parser.ExpressionContext(self, _parentctx, _parentState)) + localctx.first = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) + self.state = 182 + if not self.precpred(self._ctx, 16): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 16)") + self.state = 183 + self.match(Q4Parser.T__23) + self.state = 184 + localctx.second = self.expression(17) + pass + + elif la_ == 2: + localctx = Q4Parser.Expr_term_lessContext(self, Q4Parser.ExpressionContext(self, _parentctx, _parentState)) + localctx.first = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) + self.state = 185 + if not self.precpred(self._ctx, 13): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 13)") + self.state = 186 + self.match(Q4Parser.T__25) + self.state = 187 + localctx.second = self.expression(14) + pass + + elif la_ == 3: + localctx = Q4Parser.Expr_term_plusContext(self, Q4Parser.ExpressionContext(self, _parentctx, _parentState)) + localctx.first = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) + self.state = 188 + if not self.precpred(self._ctx, 12): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 12)") + self.state = 189 + self.match(Q4Parser.T__26) + self.state = 190 + localctx.second = self.expression(13) + pass + + elif la_ == 4: + localctx = Q4Parser.Expr_term_minusContext(self, Q4Parser.ExpressionContext(self, _parentctx, _parentState)) + localctx.first = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) + self.state = 191 + if not self.precpred(self._ctx, 10): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 10)") + self.state = 192 + self.match(Q4Parser.T__28) + self.state = 193 + localctx.second = self.expression(11) + pass + + elif la_ == 5: + localctx = Q4Parser.Expr_term_multiplyContext(self, Q4Parser.ExpressionContext(self, _parentctx, _parentState)) + localctx.first = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) + self.state = 194 + if not self.precpred(self._ctx, 7): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 7)") + self.state = 195 + self.match(Q4Parser.T__30) + self.state = 196 + localctx.second = self.expression(8) + pass + + elif la_ == 6: + localctx = Q4Parser.Expr_term_call_functionContext(self, Q4Parser.ExpressionContext(self, _parentctx, _parentState)) + localctx.first = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) + self.state = 197 + if not self.precpred(self._ctx, 6): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 6)") + self.state = 198 + self.match(Q4Parser.T__31) + self.state = 199 + localctx.id = self.identifier() + self.state = 200 + self.match(Q4Parser.T__6) + self.state = 209 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << Q4Parser.T__6) | (1 << Q4Parser.T__24) | (1 << Q4Parser.T__27) | (1 << Q4Parser.T__29) | (1 << Q4Parser.T__32) | (1 << Q4Parser.T__33) | (1 << Q4Parser.INTEGER_LITERAL) | (1 << Q4Parser.IDENTIFIER))) != 0): + self.state = 201 + localctx.second = self.expression(0) + self.state = 206 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==Q4Parser.T__14: + self.state = 202 + self.match(Q4Parser.T__14) + self.state = 203 + self.expression(0) + self.state = 208 + self._errHandler.sync(self) + _la = self._input.LA(1) + + + + self.state = 211 + self.match(Q4Parser.T__10) + pass + + elif la_ == 7: + localctx = Q4Parser.Expr_term_useless_4Context(self, Q4Parser.ExpressionContext(self, _parentctx, _parentState)) + localctx.first = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) + self.state = 213 + if not self.precpred(self._ctx, 2): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") + self.state = 214 + self.match(Q4Parser.T__8) + self.state = 215 + localctx.second = self.expression(0) + self.state = 216 + self.match(Q4Parser.T__9) + pass + + elif la_ == 8: + localctx = Q4Parser.Expr_term_useless_5Context(self, Q4Parser.ExpressionContext(self, _parentctx, _parentState)) + self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) + self.state = 218 + if not self.precpred(self._ctx, 1): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") + self.state = 219 + self.match(Q4Parser.T__31) + self.state = 220 + self.match(Q4Parser.T__34) + pass + + + self.state = 225 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,15,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.unrollRecursionContexts(_parentctx) + return localctx + + + class IdentifierContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.value_attr = str() + self.type_attr = str() + + def IDENTIFIER(self): + return self.getToken(Q4Parser.IDENTIFIER, 0) + + def getRuleIndex(self): + return Q4Parser.RULE_identifier + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIdentifier" ): + listener.enterIdentifier(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIdentifier" ): + listener.exitIdentifier(self) + + + + + def identifier(self): + + localctx = Q4Parser.IdentifierContext(self, self._ctx, self.state) + self.enterRule(localctx, 16, self.RULE_identifier) + try: + self.enterOuterAlt(localctx, 1) + self.state = 226 + self.match(Q4Parser.IDENTIFIER) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + + def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): + if self._predicates == None: + self._predicates = dict() + self._predicates[7] = self.expression_sempred + pred = self._predicates.get(ruleIndex, None) + if pred is None: + raise Exception("No predicate with index:" + str(ruleIndex)) + else: + return pred(localctx, predIndex) + + def expression_sempred(self, localctx:ExpressionContext, predIndex:int): + if predIndex == 0: + return self.precpred(self._ctx, 16) + + + if predIndex == 1: + return self.precpred(self._ctx, 13) + + + if predIndex == 2: + return self.precpred(self._ctx, 12) + + + if predIndex == 3: + return self.precpred(self._ctx, 10) + + + if predIndex == 4: + return self.precpred(self._ctx, 7) + + + if predIndex == 5: + return self.precpred(self._ctx, 6) + + + if predIndex == 6: + return self.precpred(self._ctx, 2) + + + if predIndex == 7: + return self.precpred(self._ctx, 1) + + + + + diff --git a/HW4-keyvan-dadashzadeh-97522148/Q4/gen/__pycache__/Q4Lexer.cpython-38.pyc b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/__pycache__/Q4Lexer.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1531a8ab2a34cff4bb56dcbc386870072244be88 GIT binary patch literal 7999 zcmd^E*LM?Hlb5<%YPFnj#x~B_vTS36ZPJj&V;k^b%zzEdG%!Nwwrznd83lqcLok^k z4LJ-s=gE0Er@Q}z?@2HF@O>M+`@ZMwJnY%3YWo6D`?7D_b@Z#>t-4h=^zFW_?zI^i zZW|mkSO3%IKbmZ|zhmLuLxRGG@QZZWfE%;lb`zz@7ctu6XyV-T+pZ zJnTTQiyiQb{U>xMZX2_mmCpQQuWi(J+s^EF>~@O@oQa%CoH;miawc=;;!NSp%~={} z>6~S7mdRNbXHz)K<}8P^T+Z@1%jc|svqH|Ma#qAyF=r*5P2;STvog-gIji8TlCvt# zsyUm^Sq*2koOw8_=VvbbGC-FKF<0%Tg%xx&en7GDQBN?rgFA{vyGf>;_P$Ie4K6O%+J{t&H|h<&NR*j zI2+__h_fJPTRGdtS%|Y?&cd8UI2++?J7-bOVw}Y}OK`S>vz?sn;%ql(NzV36FyW4E zy-l#qwyn0UvE8%vk^U5Jv2fcQ?M;-xEl~WIgD3y}#?ya0^xc0vdhw6LzyJN!qkp}5 zC{0zSLj5A8NGeu} zr4pq?nx;&XN|jQnELolrBq4PO0_gynJ(2RHOWe;R;iUdibtwb z>Ljn?mFksxsX=Lw8kI&-07;f0qTnIDCyr!^=y*q*;-tu;43UVk=mJsR6SwG27K&*g z=^z;(nOu_j7S9s1#3>-zmLv-%SdM5(u1Es*2`1)|=W#L{f>RA zI8`hnDHe;tUIH==q?AjUSe7gn%ioa-u|li_sX|Fq;KD#!Jt5P@ccsQzWBi<$29?}3 z88w+T#xG*6C33B~-(8ztn^|j)B}$<}TCL~-sRQvkz2*tGH^ZChHBX9OkVF~Os254( zdh>$2KD|D(-n^VPVFS-Zl?IVSZZPk<8`2vx8_Wl3maS2wjx;(N&1ddL5%o*dAm&A3 zhA29uWP$8ZoN01~D@)0C=ceVS7iJV?mSiOhOQ)1)SLRgb*5rBey#)=0Gp05d%_?q9 zR+r44Hn((s*@E-z4Ht2(N?rZ21Mu3h0-DXbD!*Y$bV)+bBWH;95$5;`^pMn$1z zfh44*RaHqsdU{qCT{?pK6D&Fb4hNx3r~oF51R;$|8H8Dc*@)oErBXg&Az=|=vbcnF zDPcKbC1JIgoQCbxP{~8+C4??w(&8DUn+azTwi3>sh@4BM`GgAy7ZD~)mym8J>>%tS zT!xq|6}qXkf^aoqAK_X+a0~0PBz}hI@FB{6L}f@6;L;S*B3R0ZBWCSJ%-(~Tn<#|E zp&vw^uOC8Hs2@R9q#sKZfDd_zegajg{uQcn{eqY%0vGT~{Sun0^{-LY=yyqkh z6Xag~IjRQz8&os&pG0aAc(XxCXBl6jr`0$E%1S%iIESXW#(7lpjf^@pB2Lxk?axo8`TNu-S<*{w;D; z5Vi#5oq`a62WmlJTCxh`wE=mXAPfv*#z7a>9SUNW;8uADv{k)z8|L2@!cu4$>kfyp zZrF`=BO~%IY;0t^yj>8sN6{aR$peBAOGke^AxB^~cF4&J$g*Q6`giVL({=Fku7V{{(n zO;8xiBikYUuqbsO z;Ya9F`nhT3qikR4=jBCUJ6}e{3;IPXt_f@x zE68?9zl?*_FY8yV2C?-k`c-Q1s(uYmn0`&aZUth^>-r6xKmA4(CHPvuX$8V0={NOT z5nPv z<63I*iT>2`VT(`oXYvr}XLaOzuD^IYj2HS#O8QcNMN{)ie{BWg7+=>@z&HB0@@^=8 ztAA$&ZiT{k`uBLw_3!l`D8Ucwn;4)c?@`lxKqelj8I@G#hV>{W#Uee&YZ}8V4xOIEXckgT@$MKE{}F z2v3&fI%FKiP8x@eBRD(85#y-5gSrWYqsB4pxpB-mPR`>^q7??V6UIq-3FwnEaUjN* z#wlxM*FoWwaau-wx`ljajI-9jtHE}*jcn(PujIv0{AvzAx5jznf;RZKl>5H%K%P12d+-t29vY8mmLD09 z<*k#x$Ho(y&?m-I%KfzS?VLR`p3^)&H(pSCFN~KIhHJ-oxs;N=GG5c1zc#+HRs;_4 z8{=CF{MPsmZyCmS#`jhrPR;km4>GJb#x;754E!Og<4s!lL|GJYiE&+w#!r|B2t zCkmV>{7U-Qk4gPz91LWBg7LZ;U@C^q(}{STOgS zW26rlZ!Ap>nzSF92YbjiW*#7Y$nqUlFz|3M*^Zb;@kzrxO1@9XcFa7XNMJi|9;5OJ zY7QR8Fz%#zd_vQ&W-mgw=_Ykp;FV<}*1R^iz|bFU+S_Q?%ck&&-z; z@!Wigm8_;-n2*W$!hBBprTI#v<$+DTGGDuJ=&wITUm7mDH;E}Y@dw~sT{Q1OLoY-Z zJjjSq5zHya&S)^MrCftre1|`j(BK7_xFs?0#1?gd`>(d%yd#^D z2nU-3k>QbGNQ*WvU*Fcex~+Lo3xn#>c4^V3k=?0`m=+ECL&2oR+WUJINEG`Ez-D*< zKb0uHJAChjB2GsG0vxel;q{_sQ|-*A3Ys`(yDe#sG20!x>ST5%9I|P$=G^KUvv=CY z?5e^<)y*U|jXBhG=2SD7tY$Kon#B}#3UjO3EKSW}>1r;^Q1e)(n$NP-0yaf0WZCLe zmZKK2T(y|xsU<95oyH2(QdX#zv8ie~D^e?1v0BMW)G9Vjt!Aa_bXKO;uyVDQRj3|T zsn)S7)yt~YdNy5cU^QwZt5s((kJ`lQ)Mn;YXR>;A7Hd#jSRh*j7wSB=Pn*B>g8@NX z!1mv;AGHnG*#UO&P=>njs7t<$xc(Gsd?fgYbrUQ_encOxA+v4 zWB6j+36jj2y!_r)7{|_x3kcYiajZLz9U6Bc$Ow3mk7MR>T%qG>2<@;qVja4z zPXbunfUpU{i?G*|R6OvFKnpWUy8w-i7!uXui6~@nc!J?L*4h$@gfu@`Bu{VvThKx= z%>#YfIRv*)PcqNbw>uWshMOXZc+&`cf{2Hx1B)=CwiXjtA}mB`zy$GV0^&r^49qg% zr*xvH9!*W;9|}UJ9GcYoKK_MVix8)mJ)dueyq znv{F}5bOc55r05SrGFHP1h#cVhKIFqJeAfH3~Q4GxmVj6f^tgg_xWZL&LV6fY$a?X zoJ}}~a4z9I!ucr&#Lk*&sack4u~e(2+AKBOQgbXd*HZH=Wo2oxvb0!PTC6NBR+bhk zON*7I#mdrRWofapv{+eMtt_opmR2iEtCgj-O?CEk^}~dzj?V67-Tg_&>b9oAwqE>7 z1ZQj{5f9*%HF+S%>kD;kF#vufx@{k|j|z9-8x?#g608qJad8w%TP658;?6PK7%-pA zz~*xiD)h2d=uL`kP4m6(lp~fH(V{7r&ld~_<33+1JusvNwyo2mv0x;e%BGzcw%Wen za3bW7N1`dw9}lN8nHC6QjaYvK?kuT-Pof$N2I64ph=k*?hCBR_C?!MMxE39O2K?lW zscF6us_Tb^0e2)RriBJlj$jzZ936n6J+Y@0pN}prpYQDrDmnzdzv1}lgPuJTHv9s+ z)1I6%d4HN5f_E_vC+r{AU^s4{Z#cpdA>`>k-}Zz*G~vmDQFUtkc_NxhWABu(k?1yn zl%j zj_?tH3a8&64r`%an7){*z}#s>Q|TeNlB0gh0ncH(hqpxFc4s-2D9o@$vj(I7;bDJt zDcpw8k`iOPV<~4W&R|_fai^d&naY?r#{n%Anmo@g^hObI+)EP TyLk*ZXqP=5#3i}*+3f!VB9A6@ literal 0 HcmV?d00001 diff --git a/HW4-keyvan-dadashzadeh-97522148/Q4/gen/__pycache__/Q4Listener.cpython-38.pyc b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/__pycache__/Q4Listener.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a743f45af3e425aecf67c2cefaaff161ef396b86 GIT binary patch literal 10224 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 literal 0 HcmV?d00001 diff --git a/HW4-keyvan-dadashzadeh-97522148/Q4/gen/__pycache__/Q4Parser.cpython-38.pyc b/HW4-keyvan-dadashzadeh-97522148/Q4/gen/__pycache__/Q4Parser.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b1caedf718309242c886823efbe30cf3a506998 GIT binary patch literal 52099 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 Date: Fri, 2 Jul 2021 15:04:33 -0400 Subject: [PATCH 2/2] HW4-keyvan-dadashzadeh-97522148 --- HW4-keyvan-dadashzadeh-97522148/Q3/Q3.g4 | 3 +++ .../Q3/gen/Q3Parser.py | 3 +++ .../Q3/gen/__pycache__/Q3Lexer.cpython-38.pyc | Bin 7814 -> 0 bytes .../gen/__pycache__/Q3Listener.cpython-38.pyc | Bin 4794 -> 0 bytes .../Q3/gen/__pycache__/Q3Parser.cpython-38.pyc | Bin 51066 -> 0 bytes .../Q3/gen/__pycache__/__init__.cpython-38.pyc | Bin 144 -> 0 bytes 6 files changed, 6 insertions(+) delete mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Lexer.cpython-38.pyc delete mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Listener.cpython-38.pyc delete mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Parser.cpython-38.pyc delete mode 100644 HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/__init__.cpython-38.pyc diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/Q3.g4 b/HW4-keyvan-dadashzadeh-97522148/Q3/Q3.g4 index b824727..293d804 100644 --- a/HW4-keyvan-dadashzadeh-97522148/Q3/Q3.g4 +++ b/HW4-keyvan-dadashzadeh-97522148/Q3/Q3.g4 @@ -182,6 +182,8 @@ if $varEXP.type_attr == "str": #right side is math exper $value_attr = f"{temp} = {$varEXP.value_attr}\n{$varID.text} = {temp}" self.add_to_method_body(f"\t{temp} = {$varEXP.value_attr}") self.add_to_method_body(f"\t{$varID.text} = {temp}") +elif $varEXP.type_attr == "arr": + pass else: $value_attr = f"{$varID.text} = {$varEXP.value_attr}" self.add_to_method_body('\t' + $value_attr) @@ -256,6 +258,7 @@ $type_attr = self.var_dict[$iden.text] } | New IntegerType LBrack first=expression RBrack { +$type_attr = "arr" self.current_function_params += 1 } | New identifier LPran RPran diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Parser.py b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Parser.py index 73f14e4..5a861c0 100644 --- a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Parser.py +++ b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/Q3Parser.py @@ -1252,6 +1252,8 @@ def statement(self): localctx.value_attr = f"{temp} = {localctx.varEXP.value_attr}\n{(None if localctx.varID is None else self._input.getText(localctx.varID.start,localctx.varID.stop))} = {temp}" self.add_to_method_body(f"\t{temp} = {localctx.varEXP.value_attr}") self.add_to_method_body(f"\t{(None if localctx.varID is None else self._input.getText(localctx.varID.start,localctx.varID.stop))} = {temp}") + elif localctx.varEXP.type_attr == "arr": + pass else: localctx.value_attr = f"{(None if localctx.varID is None else self._input.getText(localctx.varID.start,localctx.varID.stop))} = {localctx.varEXP.value_attr}" self.add_to_method_body('\t' + localctx.value_attr) @@ -1452,6 +1454,7 @@ def expression(self, _p:int=0): self.state = 205 self.match(Q3Parser.RBrack) + localctx.type_attr = "arr" self.current_function_params += 1 pass diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Lexer.cpython-38.pyc b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Lexer.cpython-38.pyc deleted file mode 100644 index 5638ba603f612e1c65db6c16c39c6c7c5ef19413..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7814 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 bbTQ}&Ah6WkF3a&?r>z$7=0XUlfp`BC{JH`G diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Listener.cpython-38.pyc b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Listener.cpython-38.pyc deleted file mode 100644 index 15e910e6fb296cad981761fa5827ea3f5aa12451..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4794 zcmb_f>rNX-6yCKB7_f~E7<0eh3<0NwHl#O2B~4Scp+V4#TvhJMGms7Tn$8-DRF$f# z>09&#c$YrG{^^hY$}99&&zWUr&n`$&G_mBx-+mwGJ7?zX?94a${D1|Yy(ji`gyf*y1)zo%M@Vmge?ZFZ|80o>r=zs;6wr%YjOx&n?!=`d(VB zkEj1g*E2t)Sn9~CW?w-xt7-@K#zA0jzp_J=J=}Tf2%n24()5!C@BqI4-yr2y-DXxj z#naC-%>E0KVd$)nFZlu+ z0$k9z$Vz~R02d`c%tip0G#+JTz{7w?BtOO~fJZeRXA^+SfX5_1$)*5TG@fQNfX4w( zNPd>h0iM)&o-F{L0z57GMYaTZM&o6+0(chioa9&88sK@2*I5J{;$LYs*WY&>&WglEwSE(T5^VW&zgS(<%UH-dQ zd)8_5n%`lylZ)n=>z!_0cy6uPX`j0-E^3dz+pQh$)K0kvf0Xt1`HLXOy)G9|MdwsF z?Hu~aMC@NGL`OBRPgG=8S^^)mC`*CygF$}jcCQWL@zaK5)G(45`xRvNPaN0VZ#lkS zCYBS_630QSj9v3sr4BbiOvkAy6&ZVu=t>{*6W4RQZpWJ?&a>26l^aQo{fAY}QOreR zKSS-W3y+k>?qylMoa2YQ*>Z$~^{NQT`dNyO#?n;|JS&S8j*#DUZ1_lf)D?L&YvW8Xql zJI4E%*v8fyUG!UV4ZB~BqI&v2CFZdar_-*)#+A$NPp0sQq>$|Xq}Dita0UF<5v29M zBnjMD0pn6*f4Kt2V}4ESlPh3cY3yDk9S@sIr+rMkr*3a~sWWySih5oK{GJ%co;BU{ zZ^yS^R($;8oc~B1N0X(Zz_`XN)`*cDVl_gou6bjpaL01gb-KI_1)dPU*b0IVu~r$o z${mXi_nep}cPv_D>=~}npIx2{?)&hz?hw~l-(abc%-C11(NR2~*v3W}W;9Y6yN0XN zqYJNzI}`Z?_?N``#_AN88vD!DDIW7zVxL@{;!0!paIU{#(9!OR%f;`+`o>&GGGkvk z*HOGbiEVPOBh^85JIFQ~9=yOCjbNbBXm{8}3xDStjh`=^R>+7Rh*mFLpJw(u(59DN zk%yb2fJ{-J02DWb93Fe>W#pp$uM(6{FpPpqawDlEBPba~$+&uh>iw?L;4w#xp{5jS zaF?OT3X`%&0upWq?f$Lz9p N(JrKN>Edrz>VLU{^f~|l diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Parser.cpython-38.pyc b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/Q3Parser.cpython-38.pyc deleted file mode 100644 index b4324aa7b5f493d157ee023062560c99e14fbd05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51066 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.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 R!!K3?OoGq@CIZos{|`~VgBJh* diff --git a/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/__init__.cpython-38.pyc b/HW4-keyvan-dadashzadeh-97522148/Q3/gen/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 88d17177f603201dbd376ab660acdec5b24208fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmWIL<>g`k0`aBy5FYLUK2xQTwCv3`1Lo_>6MW?p7Ve7s&k