# Generated from ./Tyke.g4 by ANTLR 4.13.0
# 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():
    return [
        4,1,48,403,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,
        6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,
        2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,
        7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,
        2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30,2,31,7,31,2,32,7,32,2,33,
        7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38,2,39,7,39,
        2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2,46,
        7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,1,0,1,0,5,
        0,107,8,0,10,0,12,0,110,9,0,1,0,4,0,113,8,0,11,0,12,0,114,1,1,1,
        1,1,1,1,1,1,2,1,2,1,2,1,2,3,2,125,8,2,1,2,1,2,1,2,1,2,1,3,1,3,1,
        3,3,3,134,8,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,3,
        5,148,8,5,1,5,1,5,1,6,1,6,1,6,1,6,3,6,156,8,6,1,6,1,6,1,7,1,7,1,
        7,3,7,163,8,7,1,7,1,7,1,8,1,8,5,8,169,8,8,10,8,12,8,172,9,8,1,8,
        3,8,175,8,8,1,9,1,9,1,9,1,9,1,10,1,10,1,10,5,10,184,8,10,10,10,12,
        10,187,9,10,1,11,1,11,1,11,3,11,192,8,11,1,11,1,11,1,12,1,12,1,12,
        1,12,3,12,200,8,12,1,12,1,12,1,13,1,13,1,14,4,14,207,8,14,11,14,
        12,14,208,1,15,1,15,1,15,1,15,1,15,1,15,3,15,217,8,15,1,16,1,16,
        1,16,3,16,222,8,16,1,16,1,16,1,17,1,17,1,17,1,18,1,18,1,18,1,18,
        1,18,1,19,1,19,3,19,236,8,19,1,19,1,19,1,19,1,19,1,20,1,20,3,20,
        244,8,20,1,20,1,20,1,21,1,21,1,21,5,21,251,8,21,10,21,12,21,254,
        9,21,1,22,1,22,1,22,1,22,1,23,1,23,3,23,262,8,23,1,23,1,23,1,24,
        1,24,1,25,1,25,1,26,1,26,1,27,1,27,1,27,1,27,1,27,3,27,277,8,27,
        1,28,1,28,1,28,5,28,282,8,28,10,28,12,28,285,9,28,1,29,1,29,1,29,
        1,29,5,29,291,8,29,10,29,12,29,294,9,29,1,30,1,30,1,30,1,30,5,30,
        300,8,30,10,30,12,30,303,9,30,1,31,1,31,1,32,1,32,1,32,1,32,1,32,
        1,32,1,32,1,32,1,32,1,32,3,32,317,8,32,1,33,1,33,1,33,1,33,3,33,
        323,8,33,1,34,1,34,1,34,1,34,1,34,3,34,330,8,34,1,35,1,35,1,35,5,
        35,335,8,35,10,35,12,35,338,9,35,1,36,1,36,1,36,5,36,343,8,36,10,
        36,12,36,346,9,36,1,37,1,37,1,38,1,38,1,39,1,39,1,40,1,40,1,41,1,
        41,1,42,1,42,3,42,360,8,42,1,43,1,43,4,43,364,8,43,11,43,12,43,365,
        1,44,1,44,1,44,1,44,3,44,372,8,44,1,45,1,45,1,45,1,45,3,45,378,8,
        45,1,46,1,46,1,46,1,47,1,47,3,47,385,8,47,1,47,1,47,1,48,1,48,1,
        48,5,48,392,8,48,10,48,12,48,395,9,48,1,49,1,49,1,50,1,50,1,51,1,
        51,1,51,0,0,52,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,
        36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,
        80,82,84,86,88,90,92,94,96,98,100,102,0,9,1,0,38,39,1,0,36,37,1,
        0,36,39,1,0,17,19,1,0,11,16,1,0,20,21,1,0,41,42,3,0,27,27,33,35,
        44,44,2,0,33,34,44,44,395,0,104,1,0,0,0,2,116,1,0,0,0,4,120,1,0,
        0,0,6,130,1,0,0,0,8,137,1,0,0,0,10,143,1,0,0,0,12,151,1,0,0,0,14,
        159,1,0,0,0,16,166,1,0,0,0,18,176,1,0,0,0,20,180,1,0,0,0,22,188,
        1,0,0,0,24,195,1,0,0,0,26,203,1,0,0,0,28,206,1,0,0,0,30,216,1,0,
        0,0,32,218,1,0,0,0,34,225,1,0,0,0,36,228,1,0,0,0,38,235,1,0,0,0,
        40,241,1,0,0,0,42,247,1,0,0,0,44,255,1,0,0,0,46,259,1,0,0,0,48,265,
        1,0,0,0,50,267,1,0,0,0,52,269,1,0,0,0,54,276,1,0,0,0,56,278,1,0,
        0,0,58,286,1,0,0,0,60,295,1,0,0,0,62,304,1,0,0,0,64,316,1,0,0,0,
        66,322,1,0,0,0,68,329,1,0,0,0,70,331,1,0,0,0,72,339,1,0,0,0,74,347,
        1,0,0,0,76,349,1,0,0,0,78,351,1,0,0,0,80,353,1,0,0,0,82,355,1,0,
        0,0,84,359,1,0,0,0,86,361,1,0,0,0,88,371,1,0,0,0,90,377,1,0,0,0,
        92,379,1,0,0,0,94,382,1,0,0,0,96,388,1,0,0,0,98,396,1,0,0,0,100,
        398,1,0,0,0,102,400,1,0,0,0,104,108,3,2,1,0,105,107,3,4,2,0,106,
        105,1,0,0,0,107,110,1,0,0,0,108,106,1,0,0,0,108,109,1,0,0,0,109,
        112,1,0,0,0,110,108,1,0,0,0,111,113,3,6,3,0,112,111,1,0,0,0,113,
        114,1,0,0,0,114,112,1,0,0,0,114,115,1,0,0,0,115,1,1,0,0,0,116,117,
        5,28,0,0,117,118,5,44,0,0,118,119,5,29,0,0,119,3,1,0,0,0,120,121,
        5,31,0,0,121,122,5,30,0,0,122,124,5,1,0,0,123,125,3,42,21,0,124,
        123,1,0,0,0,124,125,1,0,0,0,125,126,1,0,0,0,126,127,5,2,0,0,127,
        128,5,44,0,0,128,129,5,29,0,0,129,5,1,0,0,0,130,131,3,8,4,0,131,
        133,5,1,0,0,132,134,3,28,14,0,133,132,1,0,0,0,133,134,1,0,0,0,134,
        135,1,0,0,0,135,136,5,2,0,0,136,7,1,0,0,0,137,138,5,3,0,0,138,139,
        5,44,0,0,139,140,3,40,20,0,140,141,5,4,0,0,141,142,3,100,50,0,142,
        9,1,0,0,0,143,144,5,24,0,0,144,145,3,74,37,0,145,147,5,1,0,0,146,
        148,3,28,14,0,147,146,1,0,0,0,147,148,1,0,0,0,148,149,1,0,0,0,149,
        150,5,2,0,0,150,11,1,0,0,0,151,152,5,25,0,0,152,153,3,74,37,0,153,
        155,5,1,0,0,154,156,3,28,14,0,155,154,1,0,0,0,155,156,1,0,0,0,156,
        157,1,0,0,0,157,158,5,2,0,0,158,13,1,0,0,0,159,160,5,26,0,0,160,
        162,5,1,0,0,161,163,3,28,14,0,162,161,1,0,0,0,162,163,1,0,0,0,163,
        164,1,0,0,0,164,165,5,2,0,0,165,15,1,0,0,0,166,170,3,10,5,0,167,
        169,3,12,6,0,168,167,1,0,0,0,169,172,1,0,0,0,170,168,1,0,0,0,170,
        171,1,0,0,0,171,174,1,0,0,0,172,170,1,0,0,0,173,175,3,14,7,0,174,
        173,1,0,0,0,174,175,1,0,0,0,175,17,1,0,0,0,176,177,5,44,0,0,177,
        178,5,5,0,0,178,179,3,90,45,0,179,19,1,0,0,0,180,185,3,18,9,0,181,
        182,5,6,0,0,182,184,3,18,9,0,183,181,1,0,0,0,184,187,1,0,0,0,185,
        183,1,0,0,0,185,186,1,0,0,0,186,21,1,0,0,0,187,185,1,0,0,0,188,189,
        5,44,0,0,189,191,5,1,0,0,190,192,3,20,10,0,191,190,1,0,0,0,191,192,
        1,0,0,0,192,193,1,0,0,0,193,194,5,2,0,0,194,23,1,0,0,0,195,196,5,
        32,0,0,196,197,3,74,37,0,197,199,5,1,0,0,198,200,3,28,14,0,199,198,
        1,0,0,0,199,200,1,0,0,0,200,201,1,0,0,0,201,202,5,2,0,0,202,25,1,
        0,0,0,203,204,3,24,12,0,204,27,1,0,0,0,205,207,3,30,15,0,206,205,
        1,0,0,0,207,208,1,0,0,0,208,206,1,0,0,0,208,209,1,0,0,0,209,29,1,
        0,0,0,210,217,3,32,16,0,211,217,3,34,17,0,212,217,3,38,19,0,213,
        217,3,36,18,0,214,217,3,16,8,0,215,217,3,26,13,0,216,210,1,0,0,0,
        216,211,1,0,0,0,216,212,1,0,0,0,216,213,1,0,0,0,216,214,1,0,0,0,
        216,215,1,0,0,0,217,31,1,0,0,0,218,221,5,7,0,0,219,222,3,88,44,0,
        220,222,3,62,31,0,221,219,1,0,0,0,221,220,1,0,0,0,221,222,1,0,0,
        0,222,223,1,0,0,0,223,224,5,29,0,0,224,33,1,0,0,0,225,226,3,92,46,
        0,226,227,5,29,0,0,227,35,1,0,0,0,228,229,3,46,23,0,229,230,5,8,
        0,0,230,231,3,90,45,0,231,232,5,29,0,0,232,37,1,0,0,0,233,236,5,
        44,0,0,234,236,3,86,43,0,235,233,1,0,0,0,235,234,1,0,0,0,236,237,
        1,0,0,0,237,238,5,8,0,0,238,239,3,90,45,0,239,240,5,29,0,0,240,39,
        1,0,0,0,241,243,5,9,0,0,242,244,3,42,21,0,243,242,1,0,0,0,243,244,
        1,0,0,0,244,245,1,0,0,0,245,246,5,10,0,0,246,41,1,0,0,0,247,252,
        3,44,22,0,248,249,5,6,0,0,249,251,3,44,22,0,250,248,1,0,0,0,251,
        254,1,0,0,0,252,250,1,0,0,0,252,253,1,0,0,0,253,43,1,0,0,0,254,252,
        1,0,0,0,255,256,5,44,0,0,256,257,5,5,0,0,257,258,3,102,51,0,258,
        45,1,0,0,0,259,261,5,22,0,0,260,262,5,23,0,0,261,260,1,0,0,0,261,
        262,1,0,0,0,262,263,1,0,0,0,263,264,5,44,0,0,264,47,1,0,0,0,265,
        266,7,0,0,0,266,49,1,0,0,0,267,268,7,1,0,0,268,51,1,0,0,0,269,270,
        7,2,0,0,270,53,1,0,0,0,271,277,3,88,44,0,272,273,5,9,0,0,273,274,
        3,62,31,0,274,275,5,10,0,0,275,277,1,0,0,0,276,271,1,0,0,0,276,272,
        1,0,0,0,277,55,1,0,0,0,278,283,3,54,27,0,279,280,5,40,0,0,280,282,
        3,54,27,0,281,279,1,0,0,0,282,285,1,0,0,0,283,281,1,0,0,0,283,284,
        1,0,0,0,284,57,1,0,0,0,285,283,1,0,0,0,286,292,3,56,28,0,287,288,
        3,48,24,0,288,289,3,56,28,0,289,291,1,0,0,0,290,287,1,0,0,0,291,
        294,1,0,0,0,292,290,1,0,0,0,292,293,1,0,0,0,293,59,1,0,0,0,294,292,
        1,0,0,0,295,301,3,58,29,0,296,297,3,50,25,0,297,298,3,58,29,0,298,
        300,1,0,0,0,299,296,1,0,0,0,300,303,1,0,0,0,301,299,1,0,0,0,301,
        302,1,0,0,0,302,61,1,0,0,0,303,301,1,0,0,0,304,305,3,60,30,0,305,
        63,1,0,0,0,306,307,3,88,44,0,307,308,3,78,39,0,308,309,3,88,44,0,
        309,317,1,0,0,0,310,311,5,9,0,0,311,312,3,88,44,0,312,313,3,78,39,
        0,313,314,3,88,44,0,314,315,5,10,0,0,315,317,1,0,0,0,316,306,1,0,
        0,0,316,310,1,0,0,0,317,65,1,0,0,0,318,323,3,80,40,0,319,323,5,44,
        0,0,320,323,3,92,46,0,321,323,3,64,32,0,322,318,1,0,0,0,322,319,
        1,0,0,0,322,320,1,0,0,0,322,321,1,0,0,0,323,67,1,0,0,0,324,330,3,
        66,33,0,325,326,5,9,0,0,326,327,3,74,37,0,327,328,5,10,0,0,328,330,
        1,0,0,0,329,324,1,0,0,0,329,325,1,0,0,0,330,69,1,0,0,0,331,336,3,
        68,34,0,332,333,5,17,0,0,333,335,3,68,34,0,334,332,1,0,0,0,335,338,
        1,0,0,0,336,334,1,0,0,0,336,337,1,0,0,0,337,71,1,0,0,0,338,336,1,
        0,0,0,339,344,3,70,35,0,340,341,5,18,0,0,341,343,3,70,35,0,342,340,
        1,0,0,0,343,346,1,0,0,0,344,342,1,0,0,0,344,345,1,0,0,0,345,73,1,
        0,0,0,346,344,1,0,0,0,347,348,3,72,36,0,348,75,1,0,0,0,349,350,7,
        3,0,0,350,77,1,0,0,0,351,352,7,4,0,0,352,79,1,0,0,0,353,354,7,5,
        0,0,354,81,1,0,0,0,355,356,7,6,0,0,356,83,1,0,0,0,357,360,3,82,41,
        0,358,360,5,45,0,0,359,357,1,0,0,0,359,358,1,0,0,0,360,85,1,0,0,
        0,361,363,5,44,0,0,362,364,5,43,0,0,363,362,1,0,0,0,364,365,1,0,
        0,0,365,363,1,0,0,0,365,366,1,0,0,0,366,87,1,0,0,0,367,372,3,84,
        42,0,368,372,5,44,0,0,369,372,3,86,43,0,370,372,3,92,46,0,371,367,
        1,0,0,0,371,368,1,0,0,0,371,369,1,0,0,0,371,370,1,0,0,0,372,89,1,
        0,0,0,373,378,3,88,44,0,374,378,3,62,31,0,375,378,3,74,37,0,376,
        378,3,22,11,0,377,373,1,0,0,0,377,374,1,0,0,0,377,375,1,0,0,0,377,
        376,1,0,0,0,378,91,1,0,0,0,379,380,5,44,0,0,380,381,3,94,47,0,381,
        93,1,0,0,0,382,384,5,9,0,0,383,385,3,96,48,0,384,383,1,0,0,0,384,
        385,1,0,0,0,385,386,1,0,0,0,386,387,5,10,0,0,387,95,1,0,0,0,388,
        393,3,98,49,0,389,390,5,6,0,0,390,392,3,98,49,0,391,389,1,0,0,0,
        392,395,1,0,0,0,393,391,1,0,0,0,393,394,1,0,0,0,394,97,1,0,0,0,395,
        393,1,0,0,0,396,397,3,90,45,0,397,99,1,0,0,0,398,399,7,7,0,0,399,
        101,1,0,0,0,400,401,7,8,0,0,401,103,1,0,0,0,34,108,114,124,133,147,
        155,162,170,174,185,191,199,208,216,221,235,243,252,261,276,283,
        292,301,316,322,329,336,344,359,365,371,377,384,393
    ]

class TykeParser ( Parser ):

    grammarFileName = "Tyke.g4"

    atn = ATNDeserializer().deserialize(serializedATN())

    decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ]

    sharedContextCache = PredictionContextCache()

    literalNames = [ "<INVALID>", "'{'", "'}'", "'def'", "'->'", "':'", 
                     "','", "'return'", "'='", "'('", "')'", "'=='", "'!='", 
                     "'<'", "'<='", "'>'", "'>='", "'and'", "'or'", "'xor'", 
                     "'true'", "'false'", "'let'", "'mut'", "'if'", "'elif'", 
                     "'else'", "'bool'", "'package'", "';'", "'struct'", 
                     "'type'", "'while'", "'double'", "'int'", "'void'", 
                     "'+'", "'-'", "'*'", "'/'", "'**'" ]

    symbolicNames = [ "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>", 
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>", 
                      "<INVALID>", "<INVALID>", "<INVALID>", "EQ", "NEQ", 
                      "LT", "LTE", "GT", "GTE", "AND", "OR", "XOR", "TRUE", 
                      "FALSE", "LET", "MUT", "IF", "ELIF", "ELSE", "BOOL", 
                      "PACKAGE", "SEMICOLON", "STRUCT", "TYPE", "WHILE", 
                      "KW_DOUBLE", "KW_INT", "VOID", "ADD", "SUBTRACT", 
                      "MULTIPLY", "DIVIDE", "KW_POWER", "DOUBLE", "INTEGER", 
                      "FIELD_REF", "NAME", "STRING", "Newline", "Whitespace", 
                      "LineComment" ]

    RULE_program = 0
    RULE_package = 1
    RULE_typedef = 2
    RULE_funcdef = 3
    RULE_signature = 4
    RULE_ifStmt = 5
    RULE_elifStmt = 6
    RULE_elseStmt = 7
    RULE_conditionalStmt = 8
    RULE_fieldInit = 9
    RULE_fieldInitList = 10
    RULE_makeStructExpr = 11
    RULE_whileStmt = 12
    RULE_loopStmt = 13
    RULE_statementList = 14
    RULE_statement = 15
    RULE_returnStmt = 16
    RULE_funcCallStmt = 17
    RULE_declareAndAssignStmt = 18
    RULE_assigmentStmt = 19
    RULE_funcDefArgList = 20
    RULE_typedArgList = 21
    RULE_typedArg = 22
    RULE_varDeclare = 23
    RULE_arith_factor_op = 24
    RULE_arith_term_op = 25
    RULE_arithmetic_op = 26
    RULE_arith_atom = 27
    RULE_power = 28
    RULE_factor = 29
    RULE_term = 30
    RULE_arthimeticExpr = 31
    RULE_comparisonExpr = 32
    RULE_simpleBooleanExpression = 33
    RULE_bool_atom = 34
    RULE_andBooleanExpression = 35
    RULE_orBooleanExpression = 36
    RULE_booleanExpression = 37
    RULE_boolean_comparison_op = 38
    RULE_numeric_comparison_op = 39
    RULE_booleanLiteral = 40
    RULE_numeric = 41
    RULE_primitive = 42
    RULE_field = 43
    RULE_simpleExpression = 44
    RULE_expression = 45
    RULE_funcCall = 46
    RULE_funcCallDataList = 47
    RULE_dataList = 48
    RULE_data = 49
    RULE_returnType = 50
    RULE_varType = 51

    ruleNames =  [ "program", "package", "typedef", "funcdef", "signature", 
                   "ifStmt", "elifStmt", "elseStmt", "conditionalStmt", 
                   "fieldInit", "fieldInitList", "makeStructExpr", "whileStmt", 
                   "loopStmt", "statementList", "statement", "returnStmt", 
                   "funcCallStmt", "declareAndAssignStmt", "assigmentStmt", 
                   "funcDefArgList", "typedArgList", "typedArg", "varDeclare", 
                   "arith_factor_op", "arith_term_op", "arithmetic_op", 
                   "arith_atom", "power", "factor", "term", "arthimeticExpr", 
                   "comparisonExpr", "simpleBooleanExpression", "bool_atom", 
                   "andBooleanExpression", "orBooleanExpression", "booleanExpression", 
                   "boolean_comparison_op", "numeric_comparison_op", "booleanLiteral", 
                   "numeric", "primitive", "field", "simpleExpression", 
                   "expression", "funcCall", "funcCallDataList", "dataList", 
                   "data", "returnType", "varType" ]

    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
    EQ=11
    NEQ=12
    LT=13
    LTE=14
    GT=15
    GTE=16
    AND=17
    OR=18
    XOR=19
    TRUE=20
    FALSE=21
    LET=22
    MUT=23
    IF=24
    ELIF=25
    ELSE=26
    BOOL=27
    PACKAGE=28
    SEMICOLON=29
    STRUCT=30
    TYPE=31
    WHILE=32
    KW_DOUBLE=33
    KW_INT=34
    VOID=35
    ADD=36
    SUBTRACT=37
    MULTIPLY=38
    DIVIDE=39
    KW_POWER=40
    DOUBLE=41
    INTEGER=42
    FIELD_REF=43
    NAME=44
    STRING=45
    Newline=46
    Whitespace=47
    LineComment=48

    def __init__(self, input:TokenStream, output:TextIO = sys.stdout):
        super().__init__(input, output)
        self.checkVersion("4.13.0")
        self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache)
        self._predicates = None




    class ProgramContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def package(self):
            return self.getTypedRuleContext(TykeParser.PackageContext,0)


        def typedef(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(TykeParser.TypedefContext)
            else:
                return self.getTypedRuleContext(TykeParser.TypedefContext,i)


        def funcdef(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(TykeParser.FuncdefContext)
            else:
                return self.getTypedRuleContext(TykeParser.FuncdefContext,i)


        def getRuleIndex(self):
            return TykeParser.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 = TykeParser.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 = 104
            self.package()
            self.state = 108
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==31:
                self.state = 105
                self.typedef()
                self.state = 110
                self._errHandler.sync(self)
                _la = self._input.LA(1)

            self.state = 112 
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while True:
                self.state = 111
                self.funcdef()
                self.state = 114 
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if not (_la==3):
                    break

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class PackageContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def PACKAGE(self):
            return self.getToken(TykeParser.PACKAGE, 0)

        def NAME(self):
            return self.getToken(TykeParser.NAME, 0)

        def SEMICOLON(self):
            return self.getToken(TykeParser.SEMICOLON, 0)

        def getRuleIndex(self):
            return TykeParser.RULE_package

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterPackage" ):
                listener.enterPackage(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitPackage" ):
                listener.exitPackage(self)




    def package(self):

        localctx = TykeParser.PackageContext(self, self._ctx, self.state)
        self.enterRule(localctx, 2, self.RULE_package)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 116
            self.match(TykeParser.PACKAGE)
            self.state = 117
            self.match(TykeParser.NAME)
            self.state = 118
            self.match(TykeParser.SEMICOLON)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class TypedefContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def TYPE(self):
            return self.getToken(TykeParser.TYPE, 0)

        def STRUCT(self):
            return self.getToken(TykeParser.STRUCT, 0)

        def NAME(self):
            return self.getToken(TykeParser.NAME, 0)

        def SEMICOLON(self):
            return self.getToken(TykeParser.SEMICOLON, 0)

        def typedArgList(self):
            return self.getTypedRuleContext(TykeParser.TypedArgListContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_typedef

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterTypedef" ):
                listener.enterTypedef(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitTypedef" ):
                listener.exitTypedef(self)




    def typedef(self):

        localctx = TykeParser.TypedefContext(self, self._ctx, self.state)
        self.enterRule(localctx, 4, self.RULE_typedef)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 120
            self.match(TykeParser.TYPE)
            self.state = 121
            self.match(TykeParser.STRUCT)
            self.state = 122
            self.match(TykeParser.T__0)
            self.state = 124
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if _la==44:
                self.state = 123
                self.typedArgList()


            self.state = 126
            self.match(TykeParser.T__1)
            self.state = 127
            self.match(TykeParser.NAME)
            self.state = 128
            self.match(TykeParser.SEMICOLON)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class FuncdefContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def signature(self):
            return self.getTypedRuleContext(TykeParser.SignatureContext,0)


        def statementList(self):
            return self.getTypedRuleContext(TykeParser.StatementListContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_funcdef

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterFuncdef" ):
                listener.enterFuncdef(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitFuncdef" ):
                listener.exitFuncdef(self)




    def funcdef(self):

        localctx = TykeParser.FuncdefContext(self, self._ctx, self.state)
        self.enterRule(localctx, 6, self.RULE_funcdef)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 130
            self.signature()
            self.state = 131
            self.match(TykeParser.T__0)
            self.state = 133
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if (((_la) & ~0x3f) == 0 and ((1 << _la) & 17596501983360) != 0):
                self.state = 132
                self.statementList()


            self.state = 135
            self.match(TykeParser.T__1)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class SignatureContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def NAME(self):
            return self.getToken(TykeParser.NAME, 0)

        def funcDefArgList(self):
            return self.getTypedRuleContext(TykeParser.FuncDefArgListContext,0)


        def returnType(self):
            return self.getTypedRuleContext(TykeParser.ReturnTypeContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_signature

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterSignature" ):
                listener.enterSignature(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitSignature" ):
                listener.exitSignature(self)




    def signature(self):

        localctx = TykeParser.SignatureContext(self, self._ctx, self.state)
        self.enterRule(localctx, 8, self.RULE_signature)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 137
            self.match(TykeParser.T__2)
            self.state = 138
            self.match(TykeParser.NAME)
            self.state = 139
            self.funcDefArgList()
            self.state = 140
            self.match(TykeParser.T__3)
            self.state = 141
            self.returnType()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class IfStmtContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def IF(self):
            return self.getToken(TykeParser.IF, 0)

        def booleanExpression(self):
            return self.getTypedRuleContext(TykeParser.BooleanExpressionContext,0)


        def statementList(self):
            return self.getTypedRuleContext(TykeParser.StatementListContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_ifStmt

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterIfStmt" ):
                listener.enterIfStmt(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitIfStmt" ):
                listener.exitIfStmt(self)




    def ifStmt(self):

        localctx = TykeParser.IfStmtContext(self, self._ctx, self.state)
        self.enterRule(localctx, 10, self.RULE_ifStmt)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 143
            self.match(TykeParser.IF)
            self.state = 144
            self.booleanExpression()
            self.state = 145
            self.match(TykeParser.T__0)
            self.state = 147
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if (((_la) & ~0x3f) == 0 and ((1 << _la) & 17596501983360) != 0):
                self.state = 146
                self.statementList()


            self.state = 149
            self.match(TykeParser.T__1)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class ElifStmtContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def ELIF(self):
            return self.getToken(TykeParser.ELIF, 0)

        def booleanExpression(self):
            return self.getTypedRuleContext(TykeParser.BooleanExpressionContext,0)


        def statementList(self):
            return self.getTypedRuleContext(TykeParser.StatementListContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_elifStmt

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterElifStmt" ):
                listener.enterElifStmt(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitElifStmt" ):
                listener.exitElifStmt(self)




    def elifStmt(self):

        localctx = TykeParser.ElifStmtContext(self, self._ctx, self.state)
        self.enterRule(localctx, 12, self.RULE_elifStmt)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 151
            self.match(TykeParser.ELIF)
            self.state = 152
            self.booleanExpression()
            self.state = 153
            self.match(TykeParser.T__0)
            self.state = 155
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if (((_la) & ~0x3f) == 0 and ((1 << _la) & 17596501983360) != 0):
                self.state = 154
                self.statementList()


            self.state = 157
            self.match(TykeParser.T__1)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class ElseStmtContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def ELSE(self):
            return self.getToken(TykeParser.ELSE, 0)

        def statementList(self):
            return self.getTypedRuleContext(TykeParser.StatementListContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_elseStmt

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterElseStmt" ):
                listener.enterElseStmt(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitElseStmt" ):
                listener.exitElseStmt(self)




    def elseStmt(self):

        localctx = TykeParser.ElseStmtContext(self, self._ctx, self.state)
        self.enterRule(localctx, 14, self.RULE_elseStmt)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 159
            self.match(TykeParser.ELSE)
            self.state = 160
            self.match(TykeParser.T__0)
            self.state = 162
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if (((_la) & ~0x3f) == 0 and ((1 << _la) & 17596501983360) != 0):
                self.state = 161
                self.statementList()


            self.state = 164
            self.match(TykeParser.T__1)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class ConditionalStmtContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def ifStmt(self):
            return self.getTypedRuleContext(TykeParser.IfStmtContext,0)


        def elifStmt(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(TykeParser.ElifStmtContext)
            else:
                return self.getTypedRuleContext(TykeParser.ElifStmtContext,i)


        def elseStmt(self):
            return self.getTypedRuleContext(TykeParser.ElseStmtContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_conditionalStmt

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterConditionalStmt" ):
                listener.enterConditionalStmt(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitConditionalStmt" ):
                listener.exitConditionalStmt(self)




    def conditionalStmt(self):

        localctx = TykeParser.ConditionalStmtContext(self, self._ctx, self.state)
        self.enterRule(localctx, 16, self.RULE_conditionalStmt)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 166
            self.ifStmt()
            self.state = 170
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==25:
                self.state = 167
                self.elifStmt()
                self.state = 172
                self._errHandler.sync(self)
                _la = self._input.LA(1)

            self.state = 174
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if _la==26:
                self.state = 173
                self.elseStmt()


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class FieldInitContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def NAME(self):
            return self.getToken(TykeParser.NAME, 0)

        def expression(self):
            return self.getTypedRuleContext(TykeParser.ExpressionContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_fieldInit

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterFieldInit" ):
                listener.enterFieldInit(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitFieldInit" ):
                listener.exitFieldInit(self)




    def fieldInit(self):

        localctx = TykeParser.FieldInitContext(self, self._ctx, self.state)
        self.enterRule(localctx, 18, self.RULE_fieldInit)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 176
            self.match(TykeParser.NAME)
            self.state = 177
            self.match(TykeParser.T__4)
            self.state = 178
            self.expression()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class FieldInitListContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def fieldInit(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(TykeParser.FieldInitContext)
            else:
                return self.getTypedRuleContext(TykeParser.FieldInitContext,i)


        def getRuleIndex(self):
            return TykeParser.RULE_fieldInitList

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterFieldInitList" ):
                listener.enterFieldInitList(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitFieldInitList" ):
                listener.exitFieldInitList(self)




    def fieldInitList(self):

        localctx = TykeParser.FieldInitListContext(self, self._ctx, self.state)
        self.enterRule(localctx, 20, self.RULE_fieldInitList)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 180
            self.fieldInit()
            self.state = 185
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==6:
                self.state = 181
                self.match(TykeParser.T__5)
                self.state = 182
                self.fieldInit()
                self.state = 187
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class MakeStructExprContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def NAME(self):
            return self.getToken(TykeParser.NAME, 0)

        def fieldInitList(self):
            return self.getTypedRuleContext(TykeParser.FieldInitListContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_makeStructExpr

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterMakeStructExpr" ):
                listener.enterMakeStructExpr(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitMakeStructExpr" ):
                listener.exitMakeStructExpr(self)




    def makeStructExpr(self):

        localctx = TykeParser.MakeStructExprContext(self, self._ctx, self.state)
        self.enterRule(localctx, 22, self.RULE_makeStructExpr)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 188
            self.match(TykeParser.NAME)
            self.state = 189
            self.match(TykeParser.T__0)
            self.state = 191
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if _la==44:
                self.state = 190
                self.fieldInitList()


            self.state = 193
            self.match(TykeParser.T__1)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class WhileStmtContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def WHILE(self):
            return self.getToken(TykeParser.WHILE, 0)

        def booleanExpression(self):
            return self.getTypedRuleContext(TykeParser.BooleanExpressionContext,0)


        def statementList(self):
            return self.getTypedRuleContext(TykeParser.StatementListContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_whileStmt

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterWhileStmt" ):
                listener.enterWhileStmt(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitWhileStmt" ):
                listener.exitWhileStmt(self)




    def whileStmt(self):

        localctx = TykeParser.WhileStmtContext(self, self._ctx, self.state)
        self.enterRule(localctx, 24, self.RULE_whileStmt)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 195
            self.match(TykeParser.WHILE)
            self.state = 196
            self.booleanExpression()
            self.state = 197
            self.match(TykeParser.T__0)
            self.state = 199
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if (((_la) & ~0x3f) == 0 and ((1 << _la) & 17596501983360) != 0):
                self.state = 198
                self.statementList()


            self.state = 201
            self.match(TykeParser.T__1)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class LoopStmtContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def whileStmt(self):
            return self.getTypedRuleContext(TykeParser.WhileStmtContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_loopStmt

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterLoopStmt" ):
                listener.enterLoopStmt(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitLoopStmt" ):
                listener.exitLoopStmt(self)




    def loopStmt(self):

        localctx = TykeParser.LoopStmtContext(self, self._ctx, self.state)
        self.enterRule(localctx, 26, self.RULE_loopStmt)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 203
            self.whileStmt()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class StatementListContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def statement(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(TykeParser.StatementContext)
            else:
                return self.getTypedRuleContext(TykeParser.StatementContext,i)


        def getRuleIndex(self):
            return TykeParser.RULE_statementList

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterStatementList" ):
                listener.enterStatementList(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitStatementList" ):
                listener.exitStatementList(self)




    def statementList(self):

        localctx = TykeParser.StatementListContext(self, self._ctx, self.state)
        self.enterRule(localctx, 28, self.RULE_statementList)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 206 
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while True:
                self.state = 205
                self.statement()
                self.state = 208 
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & 17596501983360) != 0)):
                    break

        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):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def returnStmt(self):
            return self.getTypedRuleContext(TykeParser.ReturnStmtContext,0)


        def funcCallStmt(self):
            return self.getTypedRuleContext(TykeParser.FuncCallStmtContext,0)


        def assigmentStmt(self):
            return self.getTypedRuleContext(TykeParser.AssigmentStmtContext,0)


        def declareAndAssignStmt(self):
            return self.getTypedRuleContext(TykeParser.DeclareAndAssignStmtContext,0)


        def conditionalStmt(self):
            return self.getTypedRuleContext(TykeParser.ConditionalStmtContext,0)


        def loopStmt(self):
            return self.getTypedRuleContext(TykeParser.LoopStmtContext,0)


        def getRuleIndex(self):
            return TykeParser.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 = TykeParser.StatementContext(self, self._ctx, self.state)
        self.enterRule(localctx, 30, self.RULE_statement)
        try:
            self.state = 216
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,13,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 210
                self.returnStmt()
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 211
                self.funcCallStmt()
                pass

            elif la_ == 3:
                self.enterOuterAlt(localctx, 3)
                self.state = 212
                self.assigmentStmt()
                pass

            elif la_ == 4:
                self.enterOuterAlt(localctx, 4)
                self.state = 213
                self.declareAndAssignStmt()
                pass

            elif la_ == 5:
                self.enterOuterAlt(localctx, 5)
                self.state = 214
                self.conditionalStmt()
                pass

            elif la_ == 6:
                self.enterOuterAlt(localctx, 6)
                self.state = 215
                self.loopStmt()
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class ReturnStmtContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def SEMICOLON(self):
            return self.getToken(TykeParser.SEMICOLON, 0)

        def simpleExpression(self):
            return self.getTypedRuleContext(TykeParser.SimpleExpressionContext,0)


        def arthimeticExpr(self):
            return self.getTypedRuleContext(TykeParser.ArthimeticExprContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_returnStmt

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterReturnStmt" ):
                listener.enterReturnStmt(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitReturnStmt" ):
                listener.exitReturnStmt(self)




    def returnStmt(self):

        localctx = TykeParser.ReturnStmtContext(self, self._ctx, self.state)
        self.enterRule(localctx, 32, self.RULE_returnStmt)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 218
            self.match(TykeParser.T__6)
            self.state = 221
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,14,self._ctx)
            if la_ == 1:
                self.state = 219
                self.simpleExpression()

            elif la_ == 2:
                self.state = 220
                self.arthimeticExpr()


            self.state = 223
            self.match(TykeParser.SEMICOLON)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class FuncCallStmtContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def funcCall(self):
            return self.getTypedRuleContext(TykeParser.FuncCallContext,0)


        def SEMICOLON(self):
            return self.getToken(TykeParser.SEMICOLON, 0)

        def getRuleIndex(self):
            return TykeParser.RULE_funcCallStmt

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterFuncCallStmt" ):
                listener.enterFuncCallStmt(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitFuncCallStmt" ):
                listener.exitFuncCallStmt(self)




    def funcCallStmt(self):

        localctx = TykeParser.FuncCallStmtContext(self, self._ctx, self.state)
        self.enterRule(localctx, 34, self.RULE_funcCallStmt)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 225
            self.funcCall()
            self.state = 226
            self.match(TykeParser.SEMICOLON)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class DeclareAndAssignStmtContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def varDeclare(self):
            return self.getTypedRuleContext(TykeParser.VarDeclareContext,0)


        def expression(self):
            return self.getTypedRuleContext(TykeParser.ExpressionContext,0)


        def SEMICOLON(self):
            return self.getToken(TykeParser.SEMICOLON, 0)

        def getRuleIndex(self):
            return TykeParser.RULE_declareAndAssignStmt

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterDeclareAndAssignStmt" ):
                listener.enterDeclareAndAssignStmt(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitDeclareAndAssignStmt" ):
                listener.exitDeclareAndAssignStmt(self)




    def declareAndAssignStmt(self):

        localctx = TykeParser.DeclareAndAssignStmtContext(self, self._ctx, self.state)
        self.enterRule(localctx, 36, self.RULE_declareAndAssignStmt)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 228
            self.varDeclare()
            self.state = 229
            self.match(TykeParser.T__7)
            self.state = 230
            self.expression()
            self.state = 231
            self.match(TykeParser.SEMICOLON)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class AssigmentStmtContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def expression(self):
            return self.getTypedRuleContext(TykeParser.ExpressionContext,0)


        def SEMICOLON(self):
            return self.getToken(TykeParser.SEMICOLON, 0)

        def NAME(self):
            return self.getToken(TykeParser.NAME, 0)

        def field(self):
            return self.getTypedRuleContext(TykeParser.FieldContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_assigmentStmt

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterAssigmentStmt" ):
                listener.enterAssigmentStmt(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitAssigmentStmt" ):
                listener.exitAssigmentStmt(self)




    def assigmentStmt(self):

        localctx = TykeParser.AssigmentStmtContext(self, self._ctx, self.state)
        self.enterRule(localctx, 38, self.RULE_assigmentStmt)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 235
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,15,self._ctx)
            if la_ == 1:
                self.state = 233
                self.match(TykeParser.NAME)
                pass

            elif la_ == 2:
                self.state = 234
                self.field()
                pass


            self.state = 237
            self.match(TykeParser.T__7)
            self.state = 238
            self.expression()
            self.state = 239
            self.match(TykeParser.SEMICOLON)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class FuncDefArgListContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def typedArgList(self):
            return self.getTypedRuleContext(TykeParser.TypedArgListContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_funcDefArgList

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterFuncDefArgList" ):
                listener.enterFuncDefArgList(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitFuncDefArgList" ):
                listener.exitFuncDefArgList(self)




    def funcDefArgList(self):

        localctx = TykeParser.FuncDefArgListContext(self, self._ctx, self.state)
        self.enterRule(localctx, 40, self.RULE_funcDefArgList)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 241
            self.match(TykeParser.T__8)
            self.state = 243
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if _la==44:
                self.state = 242
                self.typedArgList()


            self.state = 245
            self.match(TykeParser.T__9)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class TypedArgListContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def typedArg(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(TykeParser.TypedArgContext)
            else:
                return self.getTypedRuleContext(TykeParser.TypedArgContext,i)


        def getRuleIndex(self):
            return TykeParser.RULE_typedArgList

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterTypedArgList" ):
                listener.enterTypedArgList(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitTypedArgList" ):
                listener.exitTypedArgList(self)




    def typedArgList(self):

        localctx = TykeParser.TypedArgListContext(self, self._ctx, self.state)
        self.enterRule(localctx, 42, self.RULE_typedArgList)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 247
            self.typedArg()
            self.state = 252
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==6:
                self.state = 248
                self.match(TykeParser.T__5)
                self.state = 249
                self.typedArg()
                self.state = 254
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class TypedArgContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def NAME(self):
            return self.getToken(TykeParser.NAME, 0)

        def varType(self):
            return self.getTypedRuleContext(TykeParser.VarTypeContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_typedArg

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterTypedArg" ):
                listener.enterTypedArg(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitTypedArg" ):
                listener.exitTypedArg(self)




    def typedArg(self):

        localctx = TykeParser.TypedArgContext(self, self._ctx, self.state)
        self.enterRule(localctx, 44, self.RULE_typedArg)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 255
            self.match(TykeParser.NAME)
            self.state = 256
            self.match(TykeParser.T__4)
            self.state = 257
            self.varType()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class VarDeclareContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def LET(self):
            return self.getToken(TykeParser.LET, 0)

        def NAME(self):
            return self.getToken(TykeParser.NAME, 0)

        def MUT(self):
            return self.getToken(TykeParser.MUT, 0)

        def getRuleIndex(self):
            return TykeParser.RULE_varDeclare

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterVarDeclare" ):
                listener.enterVarDeclare(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitVarDeclare" ):
                listener.exitVarDeclare(self)




    def varDeclare(self):

        localctx = TykeParser.VarDeclareContext(self, self._ctx, self.state)
        self.enterRule(localctx, 46, self.RULE_varDeclare)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 259
            self.match(TykeParser.LET)
            self.state = 261
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if _la==23:
                self.state = 260
                self.match(TykeParser.MUT)


            self.state = 263
            self.match(TykeParser.NAME)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Arith_factor_opContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def MULTIPLY(self):
            return self.getToken(TykeParser.MULTIPLY, 0)

        def DIVIDE(self):
            return self.getToken(TykeParser.DIVIDE, 0)

        def getRuleIndex(self):
            return TykeParser.RULE_arith_factor_op

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterArith_factor_op" ):
                listener.enterArith_factor_op(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitArith_factor_op" ):
                listener.exitArith_factor_op(self)




    def arith_factor_op(self):

        localctx = TykeParser.Arith_factor_opContext(self, self._ctx, self.state)
        self.enterRule(localctx, 48, self.RULE_arith_factor_op)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 265
            _la = self._input.LA(1)
            if not(_la==38 or _la==39):
                self._errHandler.recoverInline(self)
            else:
                self._errHandler.reportMatch(self)
                self.consume()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Arith_term_opContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def ADD(self):
            return self.getToken(TykeParser.ADD, 0)

        def SUBTRACT(self):
            return self.getToken(TykeParser.SUBTRACT, 0)

        def getRuleIndex(self):
            return TykeParser.RULE_arith_term_op

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterArith_term_op" ):
                listener.enterArith_term_op(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitArith_term_op" ):
                listener.exitArith_term_op(self)




    def arith_term_op(self):

        localctx = TykeParser.Arith_term_opContext(self, self._ctx, self.state)
        self.enterRule(localctx, 50, self.RULE_arith_term_op)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 267
            _la = self._input.LA(1)
            if not(_la==36 or _la==37):
                self._errHandler.recoverInline(self)
            else:
                self._errHandler.reportMatch(self)
                self.consume()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Arithmetic_opContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def ADD(self):
            return self.getToken(TykeParser.ADD, 0)

        def SUBTRACT(self):
            return self.getToken(TykeParser.SUBTRACT, 0)

        def MULTIPLY(self):
            return self.getToken(TykeParser.MULTIPLY, 0)

        def DIVIDE(self):
            return self.getToken(TykeParser.DIVIDE, 0)

        def getRuleIndex(self):
            return TykeParser.RULE_arithmetic_op

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterArithmetic_op" ):
                listener.enterArithmetic_op(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitArithmetic_op" ):
                listener.exitArithmetic_op(self)




    def arithmetic_op(self):

        localctx = TykeParser.Arithmetic_opContext(self, self._ctx, self.state)
        self.enterRule(localctx, 52, self.RULE_arithmetic_op)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 269
            _la = self._input.LA(1)
            if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 1030792151040) != 0)):
                self._errHandler.recoverInline(self)
            else:
                self._errHandler.reportMatch(self)
                self.consume()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Arith_atomContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def simpleExpression(self):
            return self.getTypedRuleContext(TykeParser.SimpleExpressionContext,0)


        def arthimeticExpr(self):
            return self.getTypedRuleContext(TykeParser.ArthimeticExprContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_arith_atom

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterArith_atom" ):
                listener.enterArith_atom(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitArith_atom" ):
                listener.exitArith_atom(self)




    def arith_atom(self):

        localctx = TykeParser.Arith_atomContext(self, self._ctx, self.state)
        self.enterRule(localctx, 54, self.RULE_arith_atom)
        try:
            self.state = 276
            self._errHandler.sync(self)
            token = self._input.LA(1)
            if token in [41, 42, 44, 45]:
                self.enterOuterAlt(localctx, 1)
                self.state = 271
                self.simpleExpression()
                pass
            elif token in [9]:
                self.enterOuterAlt(localctx, 2)
                self.state = 272
                self.match(TykeParser.T__8)
                self.state = 273
                self.arthimeticExpr()
                self.state = 274
                self.match(TykeParser.T__9)
                pass
            else:
                raise NoViableAltException(self)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class PowerContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def arith_atom(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(TykeParser.Arith_atomContext)
            else:
                return self.getTypedRuleContext(TykeParser.Arith_atomContext,i)


        def KW_POWER(self, i:int=None):
            if i is None:
                return self.getTokens(TykeParser.KW_POWER)
            else:
                return self.getToken(TykeParser.KW_POWER, i)

        def getRuleIndex(self):
            return TykeParser.RULE_power

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterPower" ):
                listener.enterPower(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitPower" ):
                listener.exitPower(self)




    def power(self):

        localctx = TykeParser.PowerContext(self, self._ctx, self.state)
        self.enterRule(localctx, 56, self.RULE_power)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 278
            self.arith_atom()
            self.state = 283
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==40:
                self.state = 279
                self.match(TykeParser.KW_POWER)
                self.state = 280
                self.arith_atom()
                self.state = 285
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class FactorContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def power(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(TykeParser.PowerContext)
            else:
                return self.getTypedRuleContext(TykeParser.PowerContext,i)


        def arith_factor_op(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(TykeParser.Arith_factor_opContext)
            else:
                return self.getTypedRuleContext(TykeParser.Arith_factor_opContext,i)


        def getRuleIndex(self):
            return TykeParser.RULE_factor

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterFactor" ):
                listener.enterFactor(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitFactor" ):
                listener.exitFactor(self)




    def factor(self):

        localctx = TykeParser.FactorContext(self, self._ctx, self.state)
        self.enterRule(localctx, 58, self.RULE_factor)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 286
            self.power()
            self.state = 292
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==38 or _la==39:
                self.state = 287
                self.arith_factor_op()
                self.state = 288
                self.power()
                self.state = 294
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class TermContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def factor(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(TykeParser.FactorContext)
            else:
                return self.getTypedRuleContext(TykeParser.FactorContext,i)


        def arith_term_op(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(TykeParser.Arith_term_opContext)
            else:
                return self.getTypedRuleContext(TykeParser.Arith_term_opContext,i)


        def getRuleIndex(self):
            return TykeParser.RULE_term

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterTerm" ):
                listener.enterTerm(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitTerm" ):
                listener.exitTerm(self)




    def term(self):

        localctx = TykeParser.TermContext(self, self._ctx, self.state)
        self.enterRule(localctx, 60, self.RULE_term)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 295
            self.factor()
            self.state = 301
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==36 or _la==37:
                self.state = 296
                self.arith_term_op()
                self.state = 297
                self.factor()
                self.state = 303
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class ArthimeticExprContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def term(self):
            return self.getTypedRuleContext(TykeParser.TermContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_arthimeticExpr

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterArthimeticExpr" ):
                listener.enterArthimeticExpr(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitArthimeticExpr" ):
                listener.exitArthimeticExpr(self)




    def arthimeticExpr(self):

        localctx = TykeParser.ArthimeticExprContext(self, self._ctx, self.state)
        self.enterRule(localctx, 62, self.RULE_arthimeticExpr)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 304
            self.term()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class ComparisonExprContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def simpleExpression(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(TykeParser.SimpleExpressionContext)
            else:
                return self.getTypedRuleContext(TykeParser.SimpleExpressionContext,i)


        def numeric_comparison_op(self):
            return self.getTypedRuleContext(TykeParser.Numeric_comparison_opContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_comparisonExpr

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterComparisonExpr" ):
                listener.enterComparisonExpr(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitComparisonExpr" ):
                listener.exitComparisonExpr(self)




    def comparisonExpr(self):

        localctx = TykeParser.ComparisonExprContext(self, self._ctx, self.state)
        self.enterRule(localctx, 64, self.RULE_comparisonExpr)
        try:
            self.state = 316
            self._errHandler.sync(self)
            token = self._input.LA(1)
            if token in [41, 42, 44, 45]:
                self.enterOuterAlt(localctx, 1)
                self.state = 306
                self.simpleExpression()
                self.state = 307
                self.numeric_comparison_op()
                self.state = 308
                self.simpleExpression()
                pass
            elif token in [9]:
                self.enterOuterAlt(localctx, 2)
                self.state = 310
                self.match(TykeParser.T__8)
                self.state = 311
                self.simpleExpression()
                self.state = 312
                self.numeric_comparison_op()
                self.state = 313
                self.simpleExpression()
                self.state = 314
                self.match(TykeParser.T__9)
                pass
            else:
                raise NoViableAltException(self)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class SimpleBooleanExpressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def booleanLiteral(self):
            return self.getTypedRuleContext(TykeParser.BooleanLiteralContext,0)


        def NAME(self):
            return self.getToken(TykeParser.NAME, 0)

        def funcCall(self):
            return self.getTypedRuleContext(TykeParser.FuncCallContext,0)


        def comparisonExpr(self):
            return self.getTypedRuleContext(TykeParser.ComparisonExprContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_simpleBooleanExpression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterSimpleBooleanExpression" ):
                listener.enterSimpleBooleanExpression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitSimpleBooleanExpression" ):
                listener.exitSimpleBooleanExpression(self)




    def simpleBooleanExpression(self):

        localctx = TykeParser.SimpleBooleanExpressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 66, self.RULE_simpleBooleanExpression)
        try:
            self.state = 322
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,24,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 318
                self.booleanLiteral()
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 319
                self.match(TykeParser.NAME)
                pass

            elif la_ == 3:
                self.enterOuterAlt(localctx, 3)
                self.state = 320
                self.funcCall()
                pass

            elif la_ == 4:
                self.enterOuterAlt(localctx, 4)
                self.state = 321
                self.comparisonExpr()
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Bool_atomContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def simpleBooleanExpression(self):
            return self.getTypedRuleContext(TykeParser.SimpleBooleanExpressionContext,0)


        def booleanExpression(self):
            return self.getTypedRuleContext(TykeParser.BooleanExpressionContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_bool_atom

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterBool_atom" ):
                listener.enterBool_atom(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitBool_atom" ):
                listener.exitBool_atom(self)




    def bool_atom(self):

        localctx = TykeParser.Bool_atomContext(self, self._ctx, self.state)
        self.enterRule(localctx, 68, self.RULE_bool_atom)
        try:
            self.state = 329
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,25,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 324
                self.simpleBooleanExpression()
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 325
                self.match(TykeParser.T__8)
                self.state = 326
                self.booleanExpression()
                self.state = 327
                self.match(TykeParser.T__9)
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class AndBooleanExpressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def bool_atom(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(TykeParser.Bool_atomContext)
            else:
                return self.getTypedRuleContext(TykeParser.Bool_atomContext,i)


        def AND(self, i:int=None):
            if i is None:
                return self.getTokens(TykeParser.AND)
            else:
                return self.getToken(TykeParser.AND, i)

        def getRuleIndex(self):
            return TykeParser.RULE_andBooleanExpression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterAndBooleanExpression" ):
                listener.enterAndBooleanExpression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitAndBooleanExpression" ):
                listener.exitAndBooleanExpression(self)




    def andBooleanExpression(self):

        localctx = TykeParser.AndBooleanExpressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 70, self.RULE_andBooleanExpression)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 331
            self.bool_atom()
            self.state = 336
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==17:
                self.state = 332
                self.match(TykeParser.AND)
                self.state = 333
                self.bool_atom()
                self.state = 338
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class OrBooleanExpressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def andBooleanExpression(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(TykeParser.AndBooleanExpressionContext)
            else:
                return self.getTypedRuleContext(TykeParser.AndBooleanExpressionContext,i)


        def OR(self, i:int=None):
            if i is None:
                return self.getTokens(TykeParser.OR)
            else:
                return self.getToken(TykeParser.OR, i)

        def getRuleIndex(self):
            return TykeParser.RULE_orBooleanExpression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterOrBooleanExpression" ):
                listener.enterOrBooleanExpression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitOrBooleanExpression" ):
                listener.exitOrBooleanExpression(self)




    def orBooleanExpression(self):

        localctx = TykeParser.OrBooleanExpressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 72, self.RULE_orBooleanExpression)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 339
            self.andBooleanExpression()
            self.state = 344
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==18:
                self.state = 340
                self.match(TykeParser.OR)
                self.state = 341
                self.andBooleanExpression()
                self.state = 346
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class BooleanExpressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def orBooleanExpression(self):
            return self.getTypedRuleContext(TykeParser.OrBooleanExpressionContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_booleanExpression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterBooleanExpression" ):
                listener.enterBooleanExpression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitBooleanExpression" ):
                listener.exitBooleanExpression(self)




    def booleanExpression(self):

        localctx = TykeParser.BooleanExpressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 74, self.RULE_booleanExpression)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 347
            self.orBooleanExpression()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Boolean_comparison_opContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def AND(self):
            return self.getToken(TykeParser.AND, 0)

        def OR(self):
            return self.getToken(TykeParser.OR, 0)

        def XOR(self):
            return self.getToken(TykeParser.XOR, 0)

        def getRuleIndex(self):
            return TykeParser.RULE_boolean_comparison_op

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterBoolean_comparison_op" ):
                listener.enterBoolean_comparison_op(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitBoolean_comparison_op" ):
                listener.exitBoolean_comparison_op(self)




    def boolean_comparison_op(self):

        localctx = TykeParser.Boolean_comparison_opContext(self, self._ctx, self.state)
        self.enterRule(localctx, 76, self.RULE_boolean_comparison_op)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 349
            _la = self._input.LA(1)
            if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 917504) != 0)):
                self._errHandler.recoverInline(self)
            else:
                self._errHandler.reportMatch(self)
                self.consume()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Numeric_comparison_opContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def EQ(self):
            return self.getToken(TykeParser.EQ, 0)

        def NEQ(self):
            return self.getToken(TykeParser.NEQ, 0)

        def LT(self):
            return self.getToken(TykeParser.LT, 0)

        def LTE(self):
            return self.getToken(TykeParser.LTE, 0)

        def GT(self):
            return self.getToken(TykeParser.GT, 0)

        def GTE(self):
            return self.getToken(TykeParser.GTE, 0)

        def getRuleIndex(self):
            return TykeParser.RULE_numeric_comparison_op

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterNumeric_comparison_op" ):
                listener.enterNumeric_comparison_op(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitNumeric_comparison_op" ):
                listener.exitNumeric_comparison_op(self)




    def numeric_comparison_op(self):

        localctx = TykeParser.Numeric_comparison_opContext(self, self._ctx, self.state)
        self.enterRule(localctx, 78, self.RULE_numeric_comparison_op)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 351
            _la = self._input.LA(1)
            if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 129024) != 0)):
                self._errHandler.recoverInline(self)
            else:
                self._errHandler.reportMatch(self)
                self.consume()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class BooleanLiteralContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def TRUE(self):
            return self.getToken(TykeParser.TRUE, 0)

        def FALSE(self):
            return self.getToken(TykeParser.FALSE, 0)

        def getRuleIndex(self):
            return TykeParser.RULE_booleanLiteral

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterBooleanLiteral" ):
                listener.enterBooleanLiteral(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitBooleanLiteral" ):
                listener.exitBooleanLiteral(self)




    def booleanLiteral(self):

        localctx = TykeParser.BooleanLiteralContext(self, self._ctx, self.state)
        self.enterRule(localctx, 80, self.RULE_booleanLiteral)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 353
            _la = self._input.LA(1)
            if not(_la==20 or _la==21):
                self._errHandler.recoverInline(self)
            else:
                self._errHandler.reportMatch(self)
                self.consume()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class NumericContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def DOUBLE(self):
            return self.getToken(TykeParser.DOUBLE, 0)

        def INTEGER(self):
            return self.getToken(TykeParser.INTEGER, 0)

        def getRuleIndex(self):
            return TykeParser.RULE_numeric

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterNumeric" ):
                listener.enterNumeric(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitNumeric" ):
                listener.exitNumeric(self)




    def numeric(self):

        localctx = TykeParser.NumericContext(self, self._ctx, self.state)
        self.enterRule(localctx, 82, self.RULE_numeric)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 355
            _la = self._input.LA(1)
            if not(_la==41 or _la==42):
                self._errHandler.recoverInline(self)
            else:
                self._errHandler.reportMatch(self)
                self.consume()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class PrimitiveContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def numeric(self):
            return self.getTypedRuleContext(TykeParser.NumericContext,0)


        def STRING(self):
            return self.getToken(TykeParser.STRING, 0)

        def getRuleIndex(self):
            return TykeParser.RULE_primitive

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterPrimitive" ):
                listener.enterPrimitive(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitPrimitive" ):
                listener.exitPrimitive(self)




    def primitive(self):

        localctx = TykeParser.PrimitiveContext(self, self._ctx, self.state)
        self.enterRule(localctx, 84, self.RULE_primitive)
        try:
            self.state = 359
            self._errHandler.sync(self)
            token = self._input.LA(1)
            if token in [41, 42]:
                self.enterOuterAlt(localctx, 1)
                self.state = 357
                self.numeric()
                pass
            elif token in [45]:
                self.enterOuterAlt(localctx, 2)
                self.state = 358
                self.match(TykeParser.STRING)
                pass
            else:
                raise NoViableAltException(self)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class FieldContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def NAME(self):
            return self.getToken(TykeParser.NAME, 0)

        def FIELD_REF(self, i:int=None):
            if i is None:
                return self.getTokens(TykeParser.FIELD_REF)
            else:
                return self.getToken(TykeParser.FIELD_REF, i)

        def getRuleIndex(self):
            return TykeParser.RULE_field

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterField" ):
                listener.enterField(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitField" ):
                listener.exitField(self)




    def field(self):

        localctx = TykeParser.FieldContext(self, self._ctx, self.state)
        self.enterRule(localctx, 86, self.RULE_field)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 361
            self.match(TykeParser.NAME)
            self.state = 363 
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while True:
                self.state = 362
                self.match(TykeParser.FIELD_REF)
                self.state = 365 
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if not (_la==43):
                    break

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class SimpleExpressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def primitive(self):
            return self.getTypedRuleContext(TykeParser.PrimitiveContext,0)


        def NAME(self):
            return self.getToken(TykeParser.NAME, 0)

        def field(self):
            return self.getTypedRuleContext(TykeParser.FieldContext,0)


        def funcCall(self):
            return self.getTypedRuleContext(TykeParser.FuncCallContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_simpleExpression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterSimpleExpression" ):
                listener.enterSimpleExpression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitSimpleExpression" ):
                listener.exitSimpleExpression(self)




    def simpleExpression(self):

        localctx = TykeParser.SimpleExpressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 88, self.RULE_simpleExpression)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 371
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,30,self._ctx)
            if la_ == 1:
                self.state = 367
                self.primitive()
                pass

            elif la_ == 2:
                self.state = 368
                self.match(TykeParser.NAME)
                pass

            elif la_ == 3:
                self.state = 369
                self.field()
                pass

            elif la_ == 4:
                self.state = 370
                self.funcCall()
                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):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def simpleExpression(self):
            return self.getTypedRuleContext(TykeParser.SimpleExpressionContext,0)


        def arthimeticExpr(self):
            return self.getTypedRuleContext(TykeParser.ArthimeticExprContext,0)


        def booleanExpression(self):
            return self.getTypedRuleContext(TykeParser.BooleanExpressionContext,0)


        def makeStructExpr(self):
            return self.getTypedRuleContext(TykeParser.MakeStructExprContext,0)


        def getRuleIndex(self):
            return TykeParser.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):

        localctx = TykeParser.ExpressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 90, self.RULE_expression)
        try:
            self.state = 377
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,31,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 373
                self.simpleExpression()
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 374
                self.arthimeticExpr()
                pass

            elif la_ == 3:
                self.enterOuterAlt(localctx, 3)
                self.state = 375
                self.booleanExpression()
                pass

            elif la_ == 4:
                self.enterOuterAlt(localctx, 4)
                self.state = 376
                self.makeStructExpr()
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class FuncCallContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def NAME(self):
            return self.getToken(TykeParser.NAME, 0)

        def funcCallDataList(self):
            return self.getTypedRuleContext(TykeParser.FuncCallDataListContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_funcCall

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterFuncCall" ):
                listener.enterFuncCall(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitFuncCall" ):
                listener.exitFuncCall(self)




    def funcCall(self):

        localctx = TykeParser.FuncCallContext(self, self._ctx, self.state)
        self.enterRule(localctx, 92, self.RULE_funcCall)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 379
            self.match(TykeParser.NAME)
            self.state = 380
            self.funcCallDataList()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class FuncCallDataListContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def dataList(self):
            return self.getTypedRuleContext(TykeParser.DataListContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_funcCallDataList

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterFuncCallDataList" ):
                listener.enterFuncCallDataList(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitFuncCallDataList" ):
                listener.exitFuncCallDataList(self)




    def funcCallDataList(self):

        localctx = TykeParser.FuncCallDataListContext(self, self._ctx, self.state)
        self.enterRule(localctx, 94, self.RULE_funcCallDataList)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 382
            self.match(TykeParser.T__8)
            self.state = 384
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if (((_la) & ~0x3f) == 0 and ((1 << _la) & 59373631046144) != 0):
                self.state = 383
                self.dataList()


            self.state = 386
            self.match(TykeParser.T__9)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class DataListContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def data(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(TykeParser.DataContext)
            else:
                return self.getTypedRuleContext(TykeParser.DataContext,i)


        def getRuleIndex(self):
            return TykeParser.RULE_dataList

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterDataList" ):
                listener.enterDataList(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitDataList" ):
                listener.exitDataList(self)




    def dataList(self):

        localctx = TykeParser.DataListContext(self, self._ctx, self.state)
        self.enterRule(localctx, 96, self.RULE_dataList)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 388
            self.data()
            self.state = 393
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==6:
                self.state = 389
                self.match(TykeParser.T__5)
                self.state = 390
                self.data()
                self.state = 395
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class DataContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def expression(self):
            return self.getTypedRuleContext(TykeParser.ExpressionContext,0)


        def getRuleIndex(self):
            return TykeParser.RULE_data

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterData" ):
                listener.enterData(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitData" ):
                listener.exitData(self)




    def data(self):

        localctx = TykeParser.DataContext(self, self._ctx, self.state)
        self.enterRule(localctx, 98, self.RULE_data)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 396
            self.expression()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class ReturnTypeContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def VOID(self):
            return self.getToken(TykeParser.VOID, 0)

        def KW_INT(self):
            return self.getToken(TykeParser.KW_INT, 0)

        def KW_DOUBLE(self):
            return self.getToken(TykeParser.KW_DOUBLE, 0)

        def BOOL(self):
            return self.getToken(TykeParser.BOOL, 0)

        def NAME(self):
            return self.getToken(TykeParser.NAME, 0)

        def getRuleIndex(self):
            return TykeParser.RULE_returnType

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterReturnType" ):
                listener.enterReturnType(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitReturnType" ):
                listener.exitReturnType(self)




    def returnType(self):

        localctx = TykeParser.ReturnTypeContext(self, self._ctx, self.state)
        self.enterRule(localctx, 100, self.RULE_returnType)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 398
            _la = self._input.LA(1)
            if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 17652449804288) != 0)):
                self._errHandler.recoverInline(self)
            else:
                self._errHandler.reportMatch(self)
                self.consume()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class VarTypeContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def KW_DOUBLE(self):
            return self.getToken(TykeParser.KW_DOUBLE, 0)

        def KW_INT(self):
            return self.getToken(TykeParser.KW_INT, 0)

        def NAME(self):
            return self.getToken(TykeParser.NAME, 0)

        def getRuleIndex(self):
            return TykeParser.RULE_varType

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterVarType" ):
                listener.enterVarType(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitVarType" ):
                listener.exitVarType(self)




    def varType(self):

        localctx = TykeParser.VarTypeContext(self, self._ctx, self.state)
        self.enterRule(localctx, 102, self.RULE_varType)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 400
            _la = self._input.LA(1)
            if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 17617955848192) != 0)):
                self._errHandler.recoverInline(self)
            else:
                self._errHandler.reportMatch(self)
                self.consume()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx





