Module src.frontend.parser

This module contains definitions for the ParseTree and Parser classes, as well as some ansillary functions to assist.

Expand source code
"""
This module contains definitions for the ParseTree and Parser classes, as well as some ansillary functions to assist.
"""
from rply import ParserGenerator
from rply.errors import ParserGeneratorWarning
from warnings import simplefilter
from rply.token import Token

#we get werid 'non-descriptive' warnings from ParserGenerator, this ignores those
simplefilter('ignore', ParserGeneratorWarning)

class ParseTree():
    """
    ParseTree is a class that acts as each node in an ParseTree
    """
    def __init__(self, token, content):
        """
        Construct a new ParseTree object

        Args:
            token: The token type of the node.
            content: The content of that is tokenized.
        """
        self.token = token
        self.content = content

    def print_ParseTree(self, file=None, _prefix="", _last=True):
        """
        Prints the ParseTree in depth first order

        Args:
            file: The file to be written to (Defaults to Stdout).
            _prefix: A string indicating the spacing from the left side of the screen.
            _last: A boolean that indicates if a self is the last in it's immediate surroundings.
        """
        print(f"{_prefix}{'`-- ' if _last else '|-- '}{self.token}", file=file)
        _prefix += "    " if _last else "|   "
        for i, child in enumerate(self.content):
            _last = i == len(self.content)-1
            if 'content' in child.__dict__:
                child.print_ParseTree(file, _prefix, _last)
            else:
                print(f"{_prefix}{'`-- ' if _last else '|-- '}{child}", file=file)

    def __str__(self):
        """
        Produces a string representation of the Parse Tree
        """
        li = []

        ntv = [("", self, True)]

        while ntv:
            li.append(ntv[0])

            ntv = [(f"{ntv[0][0]}{'    ' if ntv[0][2] else '|   '}", x, i == len(ntv[0][1].content)-1 ) for i, x in enumerate(ntv[0][1].content)] + ntv[1:] if 'content' in ntv[0][1].__dict__ else ntv[1:]

        return "\n".join([f"{x[0]}{'`-- ' if x[2] else '|-- '}{x[1].token if 'token' in x[1].__dict__ else x[1]}" for x in li]) + "\n"

    def __repr__(self):
        """
        Constructs a list based string representation of the parse tree
        """

        li = []

        ntv = [(1, self)]

        while ntv:
            li.append((ntv[0][0], ntv[0][1].content))

            ntv = [(ntv[0][0]+1, x) for x in ntv[0][1].content if 'content' in x.__dict__] + ntv[1:]

        return "\n".join([f"{x[0]} : {[y.token if 'content' in y.__dict__ else y for y in x[1]]}" for x in li])

    def getListView(self, level):
        """
        Prints a simple list version of the tree for output. Calls itself recursively

        Args:
            level: The current level of the tree.
        """

        li = []
        li.append(f"{level+1} : {[x if 'content' not in x.__dict__ else x.token for x in self.content]}")

        for x in self.content:
            if "content" in x.__dict__:
                li.extend(x.getListView(level+1))

        if level == 0:
            return "\n".join(li)
        return li

#setup parser class
class Parser():
    """
    Definition for the Parser object, works off of rply. Contains rules for parsing.
    """
    
    def __init__(self):
        """
        Initializes the parser and tells it the allowed tokens

        """

        self.pg = ParserGenerator(
            ['COMMENT','SELF_DEFINED','OPEN_PAREN','CLOSE_PAREN','SEMICOLON','TYPE','FUNC_MODIF','BOTH_MODIF','VAR_MODIF','COMMA','OPEN_BRACK','CLOSE_BRACK','OPEN_BRACE','CLOSE_BRACE','STRING','WHILE_LOOP','FOR_LOOP','DO_LOOP','IF_BRANCH','ELSE_BRANCH','SWITCH_BRANCH','CASE','COLON','DEFAULT','RETURN','GOTO','BREAK','CONTINUE','SET','INTEGER','MUL','AEQ','SEQ','MEQ','DEQ','MODEQ','LSEQ','RSEQ','BOEQ','BAEQ','XEQ','OR','AND','BOR','XOR','BAND','EQ','NEQ','LT','GT','LEQ','GEQ','LSH','RSH','ADD','SUB','DIV','MOD','INC','DEC','SIZEOF','COMP','NOT','PRECISION','CHAR','HEX','OCT','BIN','NULL'] ,
        )
        #initialzie head and current node
        self.Head = None


    def parse(self):
        """
        The list of BNF functions and their behavior
        """
        
        @self.pg.production('program : definitionList ')
        def program(p):
            """
            Tells the parser which BNF will be the head of the tree

            Args:
                p: The matching set of tokens.

            Returns:
                The node of the ParseTree.
            """
            newNode = ParseTree("program",p)
            self.Head = newNode
            return newNode

        @self.pg.production('definitionList : definition_terminal definitionList ')
        def definitionList___definition_terminal_definitionList_(p):
            newNode = ParseTree("definitionList",p)
            self.Head = newNode
            return newNode

        @self.pg.production('definitionList : definition_terminal ')
        def definitionList___definition_terminal_(p):
            newNode = ParseTree("definitionList",p)
            self.Head = newNode
            return newNode

        @self.pg.production('definition_terminal : functionDefinition ')
        def definition_terminal___functionDefinition_(p):
            newNode = ParseTree("definition_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('definition_terminal : functionDeclaration ')
        def definition_terminal___functionDeclaration_(p):
            newNode = ParseTree("definition_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('definition_terminal : initialization ')
        def definition_terminal___initialization_(p):
            newNode = ParseTree("definition_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('definition_terminal : COMMENT ')
        def definition_terminal___COMMENT_(p):
            newNode = ParseTree("definition_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('functionDefinition : func_type SELF_DEFINED OPEN_PAREN args CLOSE_PAREN block ')
        def functionDefinition___func_type_SELF_DEFINED_OPEN_PAREN_args_CLOSE_PAREN_block_(p):
            newNode = ParseTree("function definition",p)
            self.Head = newNode
            return newNode

        @self.pg.production('functionDefinition : func_type SELF_DEFINED OPEN_PAREN CLOSE_PAREN block ')
        def functionDefinition___func_type_SELF_DEFINED_OPEN_PAREN_CLOSE_PAREN_block_(p):
            newNode = ParseTree("function definition",p)
            self.Head = newNode
            return newNode

        @self.pg.production('functionDeclaration : func_type SELF_DEFINED OPEN_PAREN args CLOSE_PAREN SEMICOLON ')
        def functionDeclaration___func_type_SELF_DEFINED_OPEN_PAREN_args_CLOSE_PAREN_SEMICOLON_(p):
            newNode = ParseTree("functionDeclaration",p)
            self.Head = newNode
            return newNode

        @self.pg.production('functionDeclaration : func_type SELF_DEFINED OPEN_PAREN CLOSE_PAREN SEMICOLON ')
        def functionDeclaration___func_type_SELF_DEFINED_OPEN_PAREN_CLOSE_PAREN_SEMICOLON_(p):
            newNode = ParseTree("functionDeclaration",p)
            self.Head = newNode
            return newNode

        @self.pg.production('func_type : TYPE ')
        def func_type___TYPE_(p):
            newNode = ParseTree("func_type",p)
            self.Head = newNode
            return newNode

        @self.pg.production('func_type : func_modif TYPE ')
        def func_type___func_modif_TYPE_(p):
            newNode = ParseTree("func_type",p)
            self.Head = newNode
            return newNode

        @self.pg.production('func_modif : func_modif_terminal ')
        def func_modif___func_modif_terminal_(p):
            newNode = ParseTree("func_modif",p)
            self.Head = newNode
            return newNode

        @self.pg.production('func_modif : func_modif_terminal func_modif ')
        def func_modif___func_modif_terminal_func_modif_(p):
            newNode = ParseTree("func_modif",p)
            self.Head = newNode
            return newNode

        @self.pg.production('func_modif_terminal : FUNC_MODIF ')
        def func_modif_terminal___FUNC_MODIF_(p):
            newNode = ParseTree("func_modif_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('func_modif_terminal : BOTH_MODIF ')
        def func_modif_terminal___BOTH_MODIF_(p):
            newNode = ParseTree("func_modif_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_modif : var_modif_terminal ')
        def var_modif___var_modif_terminal_(p):
            newNode = ParseTree("var_modif",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_modif : var_modif_terminal var_modif ')
        def var_modif___var_modif_terminal_var_modif_(p):
            newNode = ParseTree("var_modif",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_modif_terminal : VAR_MODIF ')
        def var_modif_terminal___VAR_MODIF_(p):
            newNode = ParseTree("var_modif_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_modif_terminal : BOTH_MODIF ')
        def var_modif_terminal___BOTH_MODIF_(p):
            newNode = ParseTree("var_modif_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('args : arg_terminal COMMA args ')
        def args___arg_terminal_COMMA_args_(p):
            newNode = ParseTree("args",p)
            self.Head = newNode
            return newNode

        @self.pg.production('args : arg_terminal ')
        def args___arg_terminal_(p):
            newNode = ParseTree("args",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arg_terminal : var_type SELF_DEFINED ')
        def arg_terminal___var_type_SELF_DEFINED_(p):
            newNode = ParseTree("arg_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arg_terminal : var_type SELF_DEFINED OPEN_BRACK CLOSE_BRACK ')
        def arg_terminal___var_type_SELF_DEFINED_OPEN_BRACK_CLOSE_BRACK_(p):
            newNode = ParseTree("arg_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arg_terminal : var_type ')
        def arg_terminal___var_type_(p):
            newNode = ParseTree("arg_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('block : OPEN_BRACE content CLOSE_BRACE ')
        def block___OPEN_BRACE_content_CLOSE_BRACE_(p):
            newNode = ParseTree("block",p)
            self.Head = newNode
            return newNode

        @self.pg.production('block : OPEN_BRACE CLOSE_BRACE ')
        def block___OPEN_BRACE_CLOSE_BRACE_(p):
            newNode = ParseTree("block",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content : content_terminal content ')
        def content___content_terminal_content_(p):
            newNode = ParseTree("content",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content : content_terminal ')
        def content___content_terminal_(p):
            newNode = ParseTree("content",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content_terminal : single_line ')
        def content_terminal___single_line_(p):
            newNode = ParseTree("content_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content_terminal : loop ')
        def content_terminal___loop_(p):
            newNode = ParseTree("content_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content_terminal : branch ')
        def content_terminal___branch_(p):
            newNode = ParseTree("content_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content_terminal : goto ')
        def content_terminal___goto_(p):
            newNode = ParseTree("content_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content_terminal : COMMENT ')
        def content_terminal___COMMENT_(p):
            newNode = ParseTree("content_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content_terminal : block ')
        def content_terminal___block_(p):
            newNode = ParseTree("content_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('single_line : initialization SEMICOLON ')
        def single_line___initialization_SEMICOLON_(p):
            newNode = ParseTree("single_line",p)
            self.Head = newNode
            return newNode

        @self.pg.production('single_line : function_call SEMICOLON ')
        def single_line___function_call_SEMICOLON_(p):
            newNode = ParseTree("single_line",p)
            self.Head = newNode
            return newNode

        @self.pg.production('single_line : designation SEMICOLON ')
        def single_line___designation_SEMICOLON_(p):
            newNode = ParseTree("single_line",p)
            self.Head = newNode
            return newNode

        @self.pg.production('single_line : response SEMICOLON ')
        def single_line___response_SEMICOLON_(p):
            newNode = ParseTree("single_line",p)
            self.Head = newNode
            return newNode

        @self.pg.production('single_line : collation SEMICOLON ')
        def single_line___collation_SEMICOLON_(p):
            newNode = ParseTree("single_line",p)
            self.Head = newNode
            return newNode

        @self.pg.production('single_line : SEMICOLON ')
        def single_line___SEMICOLON_(p):
            newNode = ParseTree("single_line",p)
            self.Head = newNode
            return newNode

        @self.pg.production('function_call : SELF_DEFINED OPEN_PAREN param CLOSE_PAREN ')
        def function_call___SELF_DEFINED_OPEN_PAREN_param_CLOSE_PAREN_(p):
            newNode = ParseTree("function call",p)
            self.Head = newNode
            return newNode

        @self.pg.production('function_call : SELF_DEFINED OPEN_PAREN CLOSE_PAREN ')
        def function_call___SELF_DEFINED_OPEN_PAREN_CLOSE_PAREN_(p):
            newNode = ParseTree("function call",p)
            self.Head = newNode
            return newNode

        @self.pg.production('string_literal : STRING ')
        def string_literal___STRING_(p):
            newNode = ParseTree("string literal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('param : param_terminal ')
        def param___param_terminal_(p):
            newNode = ParseTree("parameter",p)
            self.Head = newNode
            return newNode

        @self.pg.production('param : param_terminal COMMA param ')
        def param___param_terminal_COMMA_param_(p):
            newNode = ParseTree("parameter",p)
            self.Head = newNode
            return newNode

        @self.pg.production('param_terminal : arithmetic ')
        def param_terminal___arithmetic_(p):
            newNode = ParseTree("param_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('param_terminal : STRING ')
        def param_terminal___STRING_(p):
            newNode = ParseTree("param_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('loop : WHILE_LOOP OPEN_PAREN collation CLOSE_PAREN content_terminal ')
        def loop___WHILE_LOOP_OPEN_PAREN_collation_CLOSE_PAREN_content_terminal_(p):
            newNode = ParseTree("while loop",p)
            self.Head = newNode
            return newNode

        @self.pg.production('loop : FOR_LOOP OPEN_PAREN for_part_1 SEMICOLON for_part_2 SEMICOLON for_part_3 CLOSE_PAREN content_terminal ')
        def loop___FOR_LOOP_OPEN_PAREN_for_part_1_SEMICOLON_for_part_2_SEMICOLON_for_part_3_CLOSE_PAREN_content_terminal_(p):
            newNode = ParseTree("for loop",p)
            self.Head = newNode
            return newNode

        @self.pg.production('loop : DO_LOOP content_terminal WHILE_LOOP OPEN_PAREN collation CLOSE_PAREN SEMICOLON ')
        def loop___DO_LOOP_content_terminal_WHILE_LOOP_OPEN_PAREN_collation_CLOSE_PAREN_SEMICOLON_(p):
            newNode = ParseTree("do loop",p)
            self.Head = newNode
            return newNode

        @self.pg.production('branch : IF_BRANCH OPEN_PAREN collation CLOSE_PAREN if_body')
        def branch___IF_BRANCH_OPEN_PAREN_collation_CLOSE_PAREN_if_body(p):
            newNode = ParseTree("if",p)
            self.Head = newNode
            return newNode

        @self.pg.production('branch : IF_BRANCH OPEN_PAREN collation CLOSE_PAREN if_body if_expansion ')
        def branch___IF_BRANCH_OPEN_PAREN_collation_CLOSE_PAREN_if_body_if_expansion_(p):
            newNode = ParseTree("if",p)
            self.Head = newNode
            return newNode

        @self.pg.production('if_body : content_terminal ')
        def if_body___content_terminal_(p):
            newNode = ParseTree("if_body",p)
            self.Head = newNode
            return newNode

        @self.pg.production('if_expansion : ELSE_BRANCH if_body ')
        def if_expansion___ELSE_BRANCH_if_body_(p):
            newNode = ParseTree("if_expansion",p)
            self.Head = newNode
            return newNode

        @self.pg.production('branch : SWITCH_BRANCH OPEN_PAREN arithmetic CLOSE_PAREN switch_body ')
        def branch___SWITCH_BRANCH_OPEN_PAREN_arithmetic_CLOSE_PAREN_switch_body_(p):
            newNode = ParseTree("switch",p)
            self.Head = newNode
            return newNode

        @self.pg.production('switch_body : OPEN_BRACE case CLOSE_BRACE ')
        def switch_body___OPEN_BRACE_case_CLOSE_BRACE_(p):
            newNode = ParseTree("switch_body",p)
            self.Head = newNode
            return newNode

        @self.pg.production('switch_body : OPEN_BRACE cases CLOSE_BRACE ')
        def switch_body___OPEN_BRACE_cases_CLOSE_BRACE_(p):
            newNode = ParseTree("switch_body",p)
            self.Head = newNode
            return newNode

        @self.pg.production('cases : case cases ')
        def cases___case_cases_(p):
            newNode = ParseTree("cases",p)
            self.Head = newNode
            return newNode

        @self.pg.production('cases : case ')
        def cases___case_(p):
            newNode = ParseTree("cases",p)
            self.Head = newNode
            return newNode

        @self.pg.production('cases : default ')
        def cases___default_(p):
            newNode = ParseTree("cases",p)
            self.Head = newNode
            return newNode

        @self.pg.production('case : CASE value COLON ')
        def case___CASE_value_COLON_(p):
            newNode = ParseTree("case",p)
            self.Head = newNode
            return newNode

        @self.pg.production('case : CASE value COLON case_body ')
        def case___CASE_value_COLON_case_body_(p):
            newNode = ParseTree("case",p)
            self.Head = newNode
            return newNode

        @self.pg.production('default : DEFAULT COLON ')
        def default___DEFAULT_COLON_(p):
            newNode = ParseTree("default",p)
            self.Head = newNode
            return newNode

        @self.pg.production('default : DEFAULT COLON case_body ')
        def default___DEFAULT_COLON_case_body_(p):
            newNode = ParseTree("default",p)
            self.Head = newNode
            return newNode

        @self.pg.production('case_body : content ')
        def case_body___content_(p):
            newNode = ParseTree("case_body",p)
            self.Head = newNode
            return newNode

        @self.pg.production('goto : SELF_DEFINED COLON content_terminal ')
        def goto___SELF_DEFINED_COLON_content_terminal_(p):
            newNode = ParseTree("goto",p)
            self.Head = newNode
            return newNode

        @self.pg.production('goto : SELF_DEFINED COLON ')
        def goto___SELF_DEFINED_COLON_(p):
            newNode = ParseTree("goto",p)
            self.Head = newNode
            return newNode

        @self.pg.production('response : RETURN collation ')
        def response___RETURN_collation_(p):
            newNode = ParseTree("return",p)
            self.Head = newNode
            return newNode

        @self.pg.production('response : RETURN ')
        def response___RETURN_(p):
            newNode = ParseTree("return",p)
            self.Head = newNode
            return newNode

        @self.pg.production('response : GOTO SELF_DEFINED ')
        def response___GOTO_SELF_DEFINED_(p):
            newNode = ParseTree("jump",p)
            self.Head = newNode
            return newNode

        @self.pg.production('response : BREAK ')
        def response___BREAK_(p):
            newNode = ParseTree("break",p)
            self.Head = newNode
            return newNode

        @self.pg.production('response : CONTINUE ')
        def response___CONTINUE_(p):
            newNode = ParseTree("continue",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization : var_type SELF_DEFINED SET initialization_terminal ')
        def initialization___var_type_SELF_DEFINED_SET_initialization_terminal_(p):
            newNode = ParseTree("initialization",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization : var_type SELF_DEFINED ')
        def initialization___var_type_SELF_DEFINED_(p):
            newNode = ParseTree("initialization",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization : var_type SELF_DEFINED OPEN_BRACK INTEGER CLOSE_BRACK ')
        def initialization___var_type_SELF_DEFINED_OPEN_BRACK_INTEGER_CLOSE_BRACK_(p):
            newNode = ParseTree("initialization",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization : var_type MUL designation ')
        def initialization___var_type_MUL_designation_(p):
            newNode = ParseTree("initialization",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization : var_type SELF_DEFINED array_init SET initialization_terminal ')
        def initialization___var_type_SELF_DEFINED_array_init_SET_initialization_terminal_(p):
            newNode = ParseTree("initialization",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization : var_type SELF_DEFINED array_init assignment OPEN_BRACE arr_list CLOSE_BRACE ')
        def initialization___var_type_SELF_DEFINED_array_init_assignment_OPEN_BRACE_arr_list_CLOSE_BRACE_(p):
            newNode = ParseTree("initialization",p)
            self.Head = newNode
            return newNode

        @self.pg.production('array_init : OPEN_BRACK INTEGER CLOSE_BRACK ')
        def array_init___OPEN_BRACK_INTEGER_CLOSE_BRACK_(p):
            newNode = ParseTree("array_init",p)
            self.Head = newNode
            return newNode

        @self.pg.production('array_init : OPEN_BRACK CLOSE_BRACK ')
        def array_init___OPEN_BRACK_CLOSE_BRACK_(p):
            newNode = ParseTree("array_init",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization_terminal : collation ')
        def initialization_terminal___collation_(p):
            newNode = ParseTree("initialization_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization_terminal : string_literal ')
        def initialization_terminal___string_literal_(p):
            newNode = ParseTree("initialization_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_type : var_modif TYPE ')
        def var_type___var_modif_TYPE_(p):
            newNode = ParseTree("var_type",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_type : TYPE ')
        def var_type___TYPE_(p):
            newNode = ParseTree("var_type",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_1 : initialization ')
        def for_part_1___initialization_(p):
            newNode = ParseTree("for param 1",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_1 : ')
        def for_part_1___(p):
            newNode = ParseTree("for param 1",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_1 : designation ')
        def for_part_1___designation_(p):
            newNode = ParseTree("for param 1",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_2 : collation ')
        def for_part_2___collation_(p):
            newNode = ParseTree("for param 2",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_2 : ')
        def for_part_2___(p):
            newNode = ParseTree("for param 2",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_3 : designation ')
        def for_part_3___designation_(p):
            newNode = ParseTree("for param 3",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_3 : arithmetic ')
        def for_part_3___arithmetic_(p):
            newNode = ParseTree("for param 3",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_3 : ')
        def for_part_3___(p):
            newNode = ParseTree("for param 3",p)
            self.Head = newNode
            return newNode

        @self.pg.production('designation : var_access assignment collation ')
        def designation___var_access_assignment_collation_(p):
            newNode = ParseTree("designation",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arr_list : collation ')
        def arr_list___collation_(p):
            newNode = ParseTree("arr_list",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arr_list : collation COMMA arr_list ')
        def arr_list___collation_COMMA_arr_list_(p):
            newNode = ParseTree("arr_list",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : AEQ ')
        def assignment___AEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : SEQ ')
        def assignment___SEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : MEQ ')
        def assignment___MEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : DEQ ')
        def assignment___DEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : MODEQ ')
        def assignment___MODEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : LSEQ ')
        def assignment___LSEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : RSEQ ')
        def assignment___RSEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : BOEQ ')
        def assignment___BOEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : BAEQ ')
        def assignment___BAEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : XEQ ')
        def assignment___XEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : SET ')
        def assignment___SET_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation : collation_or ')
        def collation___collation_or_(p):
            newNode = ParseTree("collation",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_or : collation_and ')
        def collation_or___collation_and_(p):
            newNode = ParseTree("collation_or",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_or : collation_or OR collation_and ')
        def collation_or___collation_or_OR_collation_and_(p):
            newNode = ParseTree("collation_or",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_and : collation_bor ')
        def collation_and___collation_bor_(p):
            newNode = ParseTree("collation_and",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_and : collation_and AND collation_bor ')
        def collation_and___collation_and_AND_collation_bor_(p):
            newNode = ParseTree("collation_and",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_bor : collation_xor ')
        def collation_bor___collation_xor_(p):
            newNode = ParseTree("collation_bor",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_bor : collation_bor BOR collation_xor ')
        def collation_bor___collation_bor_BOR_collation_xor_(p):
            newNode = ParseTree("collation_bor",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_xor : collation_band ')
        def collation_xor___collation_band_(p):
            newNode = ParseTree("collation_xor",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_xor : collation_xor XOR collation_band ')
        def collation_xor___collation_xor_XOR_collation_band_(p):
            newNode = ParseTree("collation_xor",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_band : collation_eq ')
        def collation_band___collation_eq_(p):
            newNode = ParseTree("collation_band",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_band : collation_band BAND collation_eq ')
        def collation_band___collation_band_BAND_collation_eq_(p):
            newNode = ParseTree("collation_band",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_eq : collation_rel ')
        def collation_eq___collation_rel_(p):
            newNode = ParseTree("collation_eq",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_eq : collation_eq EQ collation_rel ')
        def collation_eq___collation_eq_EQ_collation_rel_(p):
            newNode = ParseTree("collation_eq",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_eq : collation_eq NEQ collation_rel ')
        def collation_eq___collation_eq_NEQ_collation_rel_(p):
            newNode = ParseTree("collation_eq",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_rel : arithmetic ')
        def collation_rel___arithmetic_(p):
            newNode = ParseTree("collation_rel",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_rel : collation_rel LT arithmetic ')
        def collation_rel___collation_rel_LT_arithmetic_(p):
            newNode = ParseTree("collation_rel",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_rel : collation_rel GT arithmetic ')
        def collation_rel___collation_rel_GT_arithmetic_(p):
            newNode = ParseTree("collation_rel",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_rel : collation_rel LEQ arithmetic ')
        def collation_rel___collation_rel_LEQ_arithmetic_(p):
            newNode = ParseTree("collation_rel",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_rel : collation_rel GEQ arithmetic ')
        def collation_rel___collation_rel_GEQ_arithmetic_(p):
            newNode = ParseTree("collation_rel",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic : arithmetic_sh ')
        def arithmetic___arithmetic_sh_(p):
            newNode = ParseTree("arithmetic",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_sh : arithmetic_pm ')
        def arithmetic_sh___arithmetic_pm_(p):
            newNode = ParseTree("arithmetic_sh",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_sh : arithmetic_sh LSH arithmetic_pm ')
        def arithmetic_sh___arithmetic_sh_LSH_arithmetic_pm_(p):
            newNode = ParseTree("arithmetic_sh",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_sh : arithmetic_sh RSH arithmetic_pm ')
        def arithmetic_sh___arithmetic_sh_RSH_arithmetic_pm_(p):
            newNode = ParseTree("arithmetic_sh",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_pm : arithmetic_mul ')
        def arithmetic_pm___arithmetic_mul_(p):
            newNode = ParseTree("arithmetic_pm",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_pm : arithmetic_pm ADD arithmetic_mul ')
        def arithmetic_pm___arithmetic_pm_ADD_arithmetic_mul_(p):
            newNode = ParseTree("arithmetic_pm",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_pm : arithmetic_pm SUB arithmetic_mul ')
        def arithmetic_pm___arithmetic_pm_SUB_arithmetic_mul_(p):
            newNode = ParseTree("arithmetic_pm",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_mul : arithmetic_cast ')
        def arithmetic_mul___arithmetic_cast_(p):
            newNode = ParseTree("arithmetic_mul",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_mul : arithmetic_mul MUL arithmetic_cast ')
        def arithmetic_mul___arithmetic_mul_MUL_arithmetic_cast_(p):
            newNode = ParseTree("arithmetic_mul",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_mul : arithmetic_mul DIV arithmetic_cast ')
        def arithmetic_mul___arithmetic_mul_DIV_arithmetic_cast_(p):
            newNode = ParseTree("arithmetic_mul",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_mul : arithmetic_mul MOD arithmetic_cast ')
        def arithmetic_mul___arithmetic_mul_MOD_arithmetic_cast_(p):
            newNode = ParseTree("arithmetic_mul",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_cast : arithmetic_unary ')
        def arithmetic_cast___arithmetic_unary_(p):
            newNode = ParseTree("arithmetic_cast",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_cast : OPEN_PAREN var_type CLOSE_PAREN arithmetic_unary ')
        def arithmetic_cast___OPEN_PAREN_var_type_CLOSE_PAREN_arithmetic_unary_(p):
            newNode = ParseTree("arithmetic_cast",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_unary : arithmetic_post ')
        def arithmetic_unary___arithmetic_post_(p):
            newNode = ParseTree("arithmetic_unary",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_unary : INC var_access ')
        def arithmetic_unary___INC_var_access_(p):
            newNode = ParseTree("arithmetic_unary",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_unary : DEC var_access ')
        def arithmetic_unary___DEC_var_access_(p):
            newNode = ParseTree("arithmetic_unary",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_unary : unary_op arithmetic_cast ')
        def arithmetic_unary___unary_op_arithmetic_cast_(p):
            newNode = ParseTree("arithmetic_unary",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_unary : SIZEOF arithmetic_unary ')
        def arithmetic_unary___SIZEOF_arithmetic_unary_(p):
            newNode = ParseTree("arithmetic_unary",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_unary : SIZEOF var_type ')
        def arithmetic_unary___SIZEOF_var_type_(p):
            newNode = ParseTree("arithmetic_unary",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_post : value ')
        def arithmetic_post___value_(p):
            newNode = ParseTree("arithmetic_post",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_post : function_call ')
        def arithmetic_post___function_call_(p):
            newNode = ParseTree("arithmetic_post",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_post : var_access ')
        def arithmetic_post___var_access_(p):
            newNode = ParseTree("arithmetic_post",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_post : var_access INC ')
        def arithmetic_post___var_access_INC_(p):
            newNode = ParseTree("arithmetic_post",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_post : var_access DEC ')
        def arithmetic_post___var_access_DEC_(p):
            newNode = ParseTree("arithmetic_post",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_post : OPEN_PAREN collation CLOSE_PAREN ')
        def arithmetic_post___OPEN_PAREN_collation_CLOSE_PAREN_(p):
            newNode = ParseTree("arithmetic_post",p)
            self.Head = newNode
            return newNode

        @self.pg.production('unary_op : BAND ')
        def unary_op___BAND_(p):
            newNode = ParseTree("unary_op",p)
            self.Head = newNode
            return newNode

        @self.pg.production('unary_op : MUL ')
        def unary_op___MUL_(p):
            newNode = ParseTree("unary_op",p)
            self.Head = newNode
            return newNode

        @self.pg.production('unary_op : ADD ')
        def unary_op___ADD_(p):
            newNode = ParseTree("unary_op",p)
            self.Head = newNode
            return newNode

        @self.pg.production('unary_op : SUB ')
        def unary_op___SUB_(p):
            newNode = ParseTree("unary_op",p)
            self.Head = newNode
            return newNode

        @self.pg.production('unary_op : COMP ')
        def unary_op___COMP_(p):
            newNode = ParseTree("unary_op",p)
            self.Head = newNode
            return newNode

        @self.pg.production('unary_op : NOT ')
        def unary_op___NOT_(p):
            newNode = ParseTree("unary_op",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_access : SELF_DEFINED ')
        def var_access___SELF_DEFINED_(p):
            newNode = ParseTree("var_access",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_access : SELF_DEFINED OPEN_BRACK collation CLOSE_BRACK ')
        def var_access___SELF_DEFINED_OPEN_BRACK_collation_CLOSE_BRACK_(p):
            newNode = ParseTree("var_access",p)
            self.Head = newNode
            return newNode

        @self.pg.production('value : INTEGER ')
        def value___INTEGER_(p):
            newNode = ParseTree("value",p)
            self.Head = newNode
            return newNode

        @self.pg.production('value : PRECISION ')
        def value___PRECISION_(p):
            newNode = ParseTree("value",p)
            self.Head = newNode
            return newNode

        @self.pg.production('value : CHAR ')
        def value___CHAR_(p):
            newNode = ParseTree("value",p)
            self.Head = newNode
            return newNode

        @self.pg.production('value : HEX ')
        def value___HEX_(p):
            newNode = ParseTree("value",p)
            self.Head = newNode
            return newNode

        @self.pg.production('value : OCT ')
        def value___OCT_(p):
            newNode = ParseTree("value",p)
            self.Head = newNode
            return newNode

        @self.pg.production('value : BIN ')
        def value___BIN_(p):
            newNode = ParseTree("value",p)
            self.Head = newNode
            return newNode

        @self.pg.production('value : NULL ')
        def value___NULL_(p):
            newNode = ParseTree("value",p)
            self.Head = newNode
            return newNode


        @self.pg.error
        def error_handle(token):
            """
            Boilerplate error handling function

            Args:
                token: The token that caused an error.
            """
            return ValueError(token)

    #boilerplate function
    def get_parser(self):
        """
        Retrieves the built version of the parser.

        Returns:
            The built parser.
        """
        return self.pg.build()

    #retrieve the trees head
    def getTree(self):
        """
        Getter for the head of the tree.

        Returns:
            The head of the tree.
        """

        return self.Head

    def print_error(self):
        """
        Prints parser error message. This function ultimately iterates through the ParseTree that was returned after the parser found an error. ParseTree's consist of tokens as well as other ParseTree's so we need to iterate to find the first token and then print its source position.
        """
        # TODO: add some more in-depth error processing to print
        # out a more detailed description of what went wrong, and possibly some suggestions
        # at to why there was a parse/syntax error. (i.e. suggest a missing semicolon)

        head = self.getTree()
        token = 0 # token hasn't been found yet, so we set value to 0

        while True and head:
            # Iterate through list of elements
            for i in head.content:

                # Could be a Token
                if(type(i) == type(Token("sample", "sample"))):

                    # Found a Token
                    token = i
                    break

            # Check again (to break out of while loop and not iterate again)
            if (type(token) == type(Token("sample", "sample"))):
                break
            else:
                # Set head to last element.
                # If this code executes then I can assume that the
                # last element is an ParseTree.
                head = head.content[len(head.content)-1]

        if token:
            print(f"ParsingError: Last token  \'{token.value}\' parsed successfully at, {token.source_pos}\n")
        else:
            # Never found a token to report, need to exit
            print("ParsingError: No ParseTree obtained\n")
            exit()



    

Classes

class ParseTree (token, content)

ParseTree is a class that acts as each node in an ParseTree

Construct a new ParseTree object

Args

token
The token type of the node.
content
The content of that is tokenized.
Expand source code
class ParseTree():
    """
    ParseTree is a class that acts as each node in an ParseTree
    """
    def __init__(self, token, content):
        """
        Construct a new ParseTree object

        Args:
            token: The token type of the node.
            content: The content of that is tokenized.
        """
        self.token = token
        self.content = content

    def print_ParseTree(self, file=None, _prefix="", _last=True):
        """
        Prints the ParseTree in depth first order

        Args:
            file: The file to be written to (Defaults to Stdout).
            _prefix: A string indicating the spacing from the left side of the screen.
            _last: A boolean that indicates if a self is the last in it's immediate surroundings.
        """
        print(f"{_prefix}{'`-- ' if _last else '|-- '}{self.token}", file=file)
        _prefix += "    " if _last else "|   "
        for i, child in enumerate(self.content):
            _last = i == len(self.content)-1
            if 'content' in child.__dict__:
                child.print_ParseTree(file, _prefix, _last)
            else:
                print(f"{_prefix}{'`-- ' if _last else '|-- '}{child}", file=file)

    def __str__(self):
        """
        Produces a string representation of the Parse Tree
        """
        li = []

        ntv = [("", self, True)]

        while ntv:
            li.append(ntv[0])

            ntv = [(f"{ntv[0][0]}{'    ' if ntv[0][2] else '|   '}", x, i == len(ntv[0][1].content)-1 ) for i, x in enumerate(ntv[0][1].content)] + ntv[1:] if 'content' in ntv[0][1].__dict__ else ntv[1:]

        return "\n".join([f"{x[0]}{'`-- ' if x[2] else '|-- '}{x[1].token if 'token' in x[1].__dict__ else x[1]}" for x in li]) + "\n"

    def __repr__(self):
        """
        Constructs a list based string representation of the parse tree
        """

        li = []

        ntv = [(1, self)]

        while ntv:
            li.append((ntv[0][0], ntv[0][1].content))

            ntv = [(ntv[0][0]+1, x) for x in ntv[0][1].content if 'content' in x.__dict__] + ntv[1:]

        return "\n".join([f"{x[0]} : {[y.token if 'content' in y.__dict__ else y for y in x[1]]}" for x in li])

    def getListView(self, level):
        """
        Prints a simple list version of the tree for output. Calls itself recursively

        Args:
            level: The current level of the tree.
        """

        li = []
        li.append(f"{level+1} : {[x if 'content' not in x.__dict__ else x.token for x in self.content]}")

        for x in self.content:
            if "content" in x.__dict__:
                li.extend(x.getListView(level+1))

        if level == 0:
            return "\n".join(li)
        return li

Methods

def getListView(self, level)

Prints a simple list version of the tree for output. Calls itself recursively

Args

level
The current level of the tree.
Expand source code
def getListView(self, level):
    """
    Prints a simple list version of the tree for output. Calls itself recursively

    Args:
        level: The current level of the tree.
    """

    li = []
    li.append(f"{level+1} : {[x if 'content' not in x.__dict__ else x.token for x in self.content]}")

    for x in self.content:
        if "content" in x.__dict__:
            li.extend(x.getListView(level+1))

    if level == 0:
        return "\n".join(li)
    return li
def print_ParseTree(self, file=None)

Prints the ParseTree in depth first order

Args

file
The file to be written to (Defaults to Stdout).
_prefix
A string indicating the spacing from the left side of the screen.
_last
A boolean that indicates if a self is the last in it's immediate surroundings.
Expand source code
def print_ParseTree(self, file=None, _prefix="", _last=True):
    """
    Prints the ParseTree in depth first order

    Args:
        file: The file to be written to (Defaults to Stdout).
        _prefix: A string indicating the spacing from the left side of the screen.
        _last: A boolean that indicates if a self is the last in it's immediate surroundings.
    """
    print(f"{_prefix}{'`-- ' if _last else '|-- '}{self.token}", file=file)
    _prefix += "    " if _last else "|   "
    for i, child in enumerate(self.content):
        _last = i == len(self.content)-1
        if 'content' in child.__dict__:
            child.print_ParseTree(file, _prefix, _last)
        else:
            print(f"{_prefix}{'`-- ' if _last else '|-- '}{child}", file=file)
class Parser

Definition for the Parser object, works off of rply. Contains rules for parsing.

Initializes the parser and tells it the allowed tokens

Expand source code
class Parser():
    """
    Definition for the Parser object, works off of rply. Contains rules for parsing.
    """
    
    def __init__(self):
        """
        Initializes the parser and tells it the allowed tokens

        """

        self.pg = ParserGenerator(
            ['COMMENT','SELF_DEFINED','OPEN_PAREN','CLOSE_PAREN','SEMICOLON','TYPE','FUNC_MODIF','BOTH_MODIF','VAR_MODIF','COMMA','OPEN_BRACK','CLOSE_BRACK','OPEN_BRACE','CLOSE_BRACE','STRING','WHILE_LOOP','FOR_LOOP','DO_LOOP','IF_BRANCH','ELSE_BRANCH','SWITCH_BRANCH','CASE','COLON','DEFAULT','RETURN','GOTO','BREAK','CONTINUE','SET','INTEGER','MUL','AEQ','SEQ','MEQ','DEQ','MODEQ','LSEQ','RSEQ','BOEQ','BAEQ','XEQ','OR','AND','BOR','XOR','BAND','EQ','NEQ','LT','GT','LEQ','GEQ','LSH','RSH','ADD','SUB','DIV','MOD','INC','DEC','SIZEOF','COMP','NOT','PRECISION','CHAR','HEX','OCT','BIN','NULL'] ,
        )
        #initialzie head and current node
        self.Head = None


    def parse(self):
        """
        The list of BNF functions and their behavior
        """
        
        @self.pg.production('program : definitionList ')
        def program(p):
            """
            Tells the parser which BNF will be the head of the tree

            Args:
                p: The matching set of tokens.

            Returns:
                The node of the ParseTree.
            """
            newNode = ParseTree("program",p)
            self.Head = newNode
            return newNode

        @self.pg.production('definitionList : definition_terminal definitionList ')
        def definitionList___definition_terminal_definitionList_(p):
            newNode = ParseTree("definitionList",p)
            self.Head = newNode
            return newNode

        @self.pg.production('definitionList : definition_terminal ')
        def definitionList___definition_terminal_(p):
            newNode = ParseTree("definitionList",p)
            self.Head = newNode
            return newNode

        @self.pg.production('definition_terminal : functionDefinition ')
        def definition_terminal___functionDefinition_(p):
            newNode = ParseTree("definition_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('definition_terminal : functionDeclaration ')
        def definition_terminal___functionDeclaration_(p):
            newNode = ParseTree("definition_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('definition_terminal : initialization ')
        def definition_terminal___initialization_(p):
            newNode = ParseTree("definition_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('definition_terminal : COMMENT ')
        def definition_terminal___COMMENT_(p):
            newNode = ParseTree("definition_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('functionDefinition : func_type SELF_DEFINED OPEN_PAREN args CLOSE_PAREN block ')
        def functionDefinition___func_type_SELF_DEFINED_OPEN_PAREN_args_CLOSE_PAREN_block_(p):
            newNode = ParseTree("function definition",p)
            self.Head = newNode
            return newNode

        @self.pg.production('functionDefinition : func_type SELF_DEFINED OPEN_PAREN CLOSE_PAREN block ')
        def functionDefinition___func_type_SELF_DEFINED_OPEN_PAREN_CLOSE_PAREN_block_(p):
            newNode = ParseTree("function definition",p)
            self.Head = newNode
            return newNode

        @self.pg.production('functionDeclaration : func_type SELF_DEFINED OPEN_PAREN args CLOSE_PAREN SEMICOLON ')
        def functionDeclaration___func_type_SELF_DEFINED_OPEN_PAREN_args_CLOSE_PAREN_SEMICOLON_(p):
            newNode = ParseTree("functionDeclaration",p)
            self.Head = newNode
            return newNode

        @self.pg.production('functionDeclaration : func_type SELF_DEFINED OPEN_PAREN CLOSE_PAREN SEMICOLON ')
        def functionDeclaration___func_type_SELF_DEFINED_OPEN_PAREN_CLOSE_PAREN_SEMICOLON_(p):
            newNode = ParseTree("functionDeclaration",p)
            self.Head = newNode
            return newNode

        @self.pg.production('func_type : TYPE ')
        def func_type___TYPE_(p):
            newNode = ParseTree("func_type",p)
            self.Head = newNode
            return newNode

        @self.pg.production('func_type : func_modif TYPE ')
        def func_type___func_modif_TYPE_(p):
            newNode = ParseTree("func_type",p)
            self.Head = newNode
            return newNode

        @self.pg.production('func_modif : func_modif_terminal ')
        def func_modif___func_modif_terminal_(p):
            newNode = ParseTree("func_modif",p)
            self.Head = newNode
            return newNode

        @self.pg.production('func_modif : func_modif_terminal func_modif ')
        def func_modif___func_modif_terminal_func_modif_(p):
            newNode = ParseTree("func_modif",p)
            self.Head = newNode
            return newNode

        @self.pg.production('func_modif_terminal : FUNC_MODIF ')
        def func_modif_terminal___FUNC_MODIF_(p):
            newNode = ParseTree("func_modif_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('func_modif_terminal : BOTH_MODIF ')
        def func_modif_terminal___BOTH_MODIF_(p):
            newNode = ParseTree("func_modif_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_modif : var_modif_terminal ')
        def var_modif___var_modif_terminal_(p):
            newNode = ParseTree("var_modif",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_modif : var_modif_terminal var_modif ')
        def var_modif___var_modif_terminal_var_modif_(p):
            newNode = ParseTree("var_modif",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_modif_terminal : VAR_MODIF ')
        def var_modif_terminal___VAR_MODIF_(p):
            newNode = ParseTree("var_modif_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_modif_terminal : BOTH_MODIF ')
        def var_modif_terminal___BOTH_MODIF_(p):
            newNode = ParseTree("var_modif_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('args : arg_terminal COMMA args ')
        def args___arg_terminal_COMMA_args_(p):
            newNode = ParseTree("args",p)
            self.Head = newNode
            return newNode

        @self.pg.production('args : arg_terminal ')
        def args___arg_terminal_(p):
            newNode = ParseTree("args",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arg_terminal : var_type SELF_DEFINED ')
        def arg_terminal___var_type_SELF_DEFINED_(p):
            newNode = ParseTree("arg_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arg_terminal : var_type SELF_DEFINED OPEN_BRACK CLOSE_BRACK ')
        def arg_terminal___var_type_SELF_DEFINED_OPEN_BRACK_CLOSE_BRACK_(p):
            newNode = ParseTree("arg_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arg_terminal : var_type ')
        def arg_terminal___var_type_(p):
            newNode = ParseTree("arg_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('block : OPEN_BRACE content CLOSE_BRACE ')
        def block___OPEN_BRACE_content_CLOSE_BRACE_(p):
            newNode = ParseTree("block",p)
            self.Head = newNode
            return newNode

        @self.pg.production('block : OPEN_BRACE CLOSE_BRACE ')
        def block___OPEN_BRACE_CLOSE_BRACE_(p):
            newNode = ParseTree("block",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content : content_terminal content ')
        def content___content_terminal_content_(p):
            newNode = ParseTree("content",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content : content_terminal ')
        def content___content_terminal_(p):
            newNode = ParseTree("content",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content_terminal : single_line ')
        def content_terminal___single_line_(p):
            newNode = ParseTree("content_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content_terminal : loop ')
        def content_terminal___loop_(p):
            newNode = ParseTree("content_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content_terminal : branch ')
        def content_terminal___branch_(p):
            newNode = ParseTree("content_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content_terminal : goto ')
        def content_terminal___goto_(p):
            newNode = ParseTree("content_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content_terminal : COMMENT ')
        def content_terminal___COMMENT_(p):
            newNode = ParseTree("content_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('content_terminal : block ')
        def content_terminal___block_(p):
            newNode = ParseTree("content_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('single_line : initialization SEMICOLON ')
        def single_line___initialization_SEMICOLON_(p):
            newNode = ParseTree("single_line",p)
            self.Head = newNode
            return newNode

        @self.pg.production('single_line : function_call SEMICOLON ')
        def single_line___function_call_SEMICOLON_(p):
            newNode = ParseTree("single_line",p)
            self.Head = newNode
            return newNode

        @self.pg.production('single_line : designation SEMICOLON ')
        def single_line___designation_SEMICOLON_(p):
            newNode = ParseTree("single_line",p)
            self.Head = newNode
            return newNode

        @self.pg.production('single_line : response SEMICOLON ')
        def single_line___response_SEMICOLON_(p):
            newNode = ParseTree("single_line",p)
            self.Head = newNode
            return newNode

        @self.pg.production('single_line : collation SEMICOLON ')
        def single_line___collation_SEMICOLON_(p):
            newNode = ParseTree("single_line",p)
            self.Head = newNode
            return newNode

        @self.pg.production('single_line : SEMICOLON ')
        def single_line___SEMICOLON_(p):
            newNode = ParseTree("single_line",p)
            self.Head = newNode
            return newNode

        @self.pg.production('function_call : SELF_DEFINED OPEN_PAREN param CLOSE_PAREN ')
        def function_call___SELF_DEFINED_OPEN_PAREN_param_CLOSE_PAREN_(p):
            newNode = ParseTree("function call",p)
            self.Head = newNode
            return newNode

        @self.pg.production('function_call : SELF_DEFINED OPEN_PAREN CLOSE_PAREN ')
        def function_call___SELF_DEFINED_OPEN_PAREN_CLOSE_PAREN_(p):
            newNode = ParseTree("function call",p)
            self.Head = newNode
            return newNode

        @self.pg.production('string_literal : STRING ')
        def string_literal___STRING_(p):
            newNode = ParseTree("string literal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('param : param_terminal ')
        def param___param_terminal_(p):
            newNode = ParseTree("parameter",p)
            self.Head = newNode
            return newNode

        @self.pg.production('param : param_terminal COMMA param ')
        def param___param_terminal_COMMA_param_(p):
            newNode = ParseTree("parameter",p)
            self.Head = newNode
            return newNode

        @self.pg.production('param_terminal : arithmetic ')
        def param_terminal___arithmetic_(p):
            newNode = ParseTree("param_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('param_terminal : STRING ')
        def param_terminal___STRING_(p):
            newNode = ParseTree("param_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('loop : WHILE_LOOP OPEN_PAREN collation CLOSE_PAREN content_terminal ')
        def loop___WHILE_LOOP_OPEN_PAREN_collation_CLOSE_PAREN_content_terminal_(p):
            newNode = ParseTree("while loop",p)
            self.Head = newNode
            return newNode

        @self.pg.production('loop : FOR_LOOP OPEN_PAREN for_part_1 SEMICOLON for_part_2 SEMICOLON for_part_3 CLOSE_PAREN content_terminal ')
        def loop___FOR_LOOP_OPEN_PAREN_for_part_1_SEMICOLON_for_part_2_SEMICOLON_for_part_3_CLOSE_PAREN_content_terminal_(p):
            newNode = ParseTree("for loop",p)
            self.Head = newNode
            return newNode

        @self.pg.production('loop : DO_LOOP content_terminal WHILE_LOOP OPEN_PAREN collation CLOSE_PAREN SEMICOLON ')
        def loop___DO_LOOP_content_terminal_WHILE_LOOP_OPEN_PAREN_collation_CLOSE_PAREN_SEMICOLON_(p):
            newNode = ParseTree("do loop",p)
            self.Head = newNode
            return newNode

        @self.pg.production('branch : IF_BRANCH OPEN_PAREN collation CLOSE_PAREN if_body')
        def branch___IF_BRANCH_OPEN_PAREN_collation_CLOSE_PAREN_if_body(p):
            newNode = ParseTree("if",p)
            self.Head = newNode
            return newNode

        @self.pg.production('branch : IF_BRANCH OPEN_PAREN collation CLOSE_PAREN if_body if_expansion ')
        def branch___IF_BRANCH_OPEN_PAREN_collation_CLOSE_PAREN_if_body_if_expansion_(p):
            newNode = ParseTree("if",p)
            self.Head = newNode
            return newNode

        @self.pg.production('if_body : content_terminal ')
        def if_body___content_terminal_(p):
            newNode = ParseTree("if_body",p)
            self.Head = newNode
            return newNode

        @self.pg.production('if_expansion : ELSE_BRANCH if_body ')
        def if_expansion___ELSE_BRANCH_if_body_(p):
            newNode = ParseTree("if_expansion",p)
            self.Head = newNode
            return newNode

        @self.pg.production('branch : SWITCH_BRANCH OPEN_PAREN arithmetic CLOSE_PAREN switch_body ')
        def branch___SWITCH_BRANCH_OPEN_PAREN_arithmetic_CLOSE_PAREN_switch_body_(p):
            newNode = ParseTree("switch",p)
            self.Head = newNode
            return newNode

        @self.pg.production('switch_body : OPEN_BRACE case CLOSE_BRACE ')
        def switch_body___OPEN_BRACE_case_CLOSE_BRACE_(p):
            newNode = ParseTree("switch_body",p)
            self.Head = newNode
            return newNode

        @self.pg.production('switch_body : OPEN_BRACE cases CLOSE_BRACE ')
        def switch_body___OPEN_BRACE_cases_CLOSE_BRACE_(p):
            newNode = ParseTree("switch_body",p)
            self.Head = newNode
            return newNode

        @self.pg.production('cases : case cases ')
        def cases___case_cases_(p):
            newNode = ParseTree("cases",p)
            self.Head = newNode
            return newNode

        @self.pg.production('cases : case ')
        def cases___case_(p):
            newNode = ParseTree("cases",p)
            self.Head = newNode
            return newNode

        @self.pg.production('cases : default ')
        def cases___default_(p):
            newNode = ParseTree("cases",p)
            self.Head = newNode
            return newNode

        @self.pg.production('case : CASE value COLON ')
        def case___CASE_value_COLON_(p):
            newNode = ParseTree("case",p)
            self.Head = newNode
            return newNode

        @self.pg.production('case : CASE value COLON case_body ')
        def case___CASE_value_COLON_case_body_(p):
            newNode = ParseTree("case",p)
            self.Head = newNode
            return newNode

        @self.pg.production('default : DEFAULT COLON ')
        def default___DEFAULT_COLON_(p):
            newNode = ParseTree("default",p)
            self.Head = newNode
            return newNode

        @self.pg.production('default : DEFAULT COLON case_body ')
        def default___DEFAULT_COLON_case_body_(p):
            newNode = ParseTree("default",p)
            self.Head = newNode
            return newNode

        @self.pg.production('case_body : content ')
        def case_body___content_(p):
            newNode = ParseTree("case_body",p)
            self.Head = newNode
            return newNode

        @self.pg.production('goto : SELF_DEFINED COLON content_terminal ')
        def goto___SELF_DEFINED_COLON_content_terminal_(p):
            newNode = ParseTree("goto",p)
            self.Head = newNode
            return newNode

        @self.pg.production('goto : SELF_DEFINED COLON ')
        def goto___SELF_DEFINED_COLON_(p):
            newNode = ParseTree("goto",p)
            self.Head = newNode
            return newNode

        @self.pg.production('response : RETURN collation ')
        def response___RETURN_collation_(p):
            newNode = ParseTree("return",p)
            self.Head = newNode
            return newNode

        @self.pg.production('response : RETURN ')
        def response___RETURN_(p):
            newNode = ParseTree("return",p)
            self.Head = newNode
            return newNode

        @self.pg.production('response : GOTO SELF_DEFINED ')
        def response___GOTO_SELF_DEFINED_(p):
            newNode = ParseTree("jump",p)
            self.Head = newNode
            return newNode

        @self.pg.production('response : BREAK ')
        def response___BREAK_(p):
            newNode = ParseTree("break",p)
            self.Head = newNode
            return newNode

        @self.pg.production('response : CONTINUE ')
        def response___CONTINUE_(p):
            newNode = ParseTree("continue",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization : var_type SELF_DEFINED SET initialization_terminal ')
        def initialization___var_type_SELF_DEFINED_SET_initialization_terminal_(p):
            newNode = ParseTree("initialization",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization : var_type SELF_DEFINED ')
        def initialization___var_type_SELF_DEFINED_(p):
            newNode = ParseTree("initialization",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization : var_type SELF_DEFINED OPEN_BRACK INTEGER CLOSE_BRACK ')
        def initialization___var_type_SELF_DEFINED_OPEN_BRACK_INTEGER_CLOSE_BRACK_(p):
            newNode = ParseTree("initialization",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization : var_type MUL designation ')
        def initialization___var_type_MUL_designation_(p):
            newNode = ParseTree("initialization",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization : var_type SELF_DEFINED array_init SET initialization_terminal ')
        def initialization___var_type_SELF_DEFINED_array_init_SET_initialization_terminal_(p):
            newNode = ParseTree("initialization",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization : var_type SELF_DEFINED array_init assignment OPEN_BRACE arr_list CLOSE_BRACE ')
        def initialization___var_type_SELF_DEFINED_array_init_assignment_OPEN_BRACE_arr_list_CLOSE_BRACE_(p):
            newNode = ParseTree("initialization",p)
            self.Head = newNode
            return newNode

        @self.pg.production('array_init : OPEN_BRACK INTEGER CLOSE_BRACK ')
        def array_init___OPEN_BRACK_INTEGER_CLOSE_BRACK_(p):
            newNode = ParseTree("array_init",p)
            self.Head = newNode
            return newNode

        @self.pg.production('array_init : OPEN_BRACK CLOSE_BRACK ')
        def array_init___OPEN_BRACK_CLOSE_BRACK_(p):
            newNode = ParseTree("array_init",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization_terminal : collation ')
        def initialization_terminal___collation_(p):
            newNode = ParseTree("initialization_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('initialization_terminal : string_literal ')
        def initialization_terminal___string_literal_(p):
            newNode = ParseTree("initialization_terminal",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_type : var_modif TYPE ')
        def var_type___var_modif_TYPE_(p):
            newNode = ParseTree("var_type",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_type : TYPE ')
        def var_type___TYPE_(p):
            newNode = ParseTree("var_type",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_1 : initialization ')
        def for_part_1___initialization_(p):
            newNode = ParseTree("for param 1",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_1 : ')
        def for_part_1___(p):
            newNode = ParseTree("for param 1",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_1 : designation ')
        def for_part_1___designation_(p):
            newNode = ParseTree("for param 1",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_2 : collation ')
        def for_part_2___collation_(p):
            newNode = ParseTree("for param 2",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_2 : ')
        def for_part_2___(p):
            newNode = ParseTree("for param 2",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_3 : designation ')
        def for_part_3___designation_(p):
            newNode = ParseTree("for param 3",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_3 : arithmetic ')
        def for_part_3___arithmetic_(p):
            newNode = ParseTree("for param 3",p)
            self.Head = newNode
            return newNode

        @self.pg.production('for_part_3 : ')
        def for_part_3___(p):
            newNode = ParseTree("for param 3",p)
            self.Head = newNode
            return newNode

        @self.pg.production('designation : var_access assignment collation ')
        def designation___var_access_assignment_collation_(p):
            newNode = ParseTree("designation",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arr_list : collation ')
        def arr_list___collation_(p):
            newNode = ParseTree("arr_list",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arr_list : collation COMMA arr_list ')
        def arr_list___collation_COMMA_arr_list_(p):
            newNode = ParseTree("arr_list",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : AEQ ')
        def assignment___AEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : SEQ ')
        def assignment___SEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : MEQ ')
        def assignment___MEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : DEQ ')
        def assignment___DEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : MODEQ ')
        def assignment___MODEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : LSEQ ')
        def assignment___LSEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : RSEQ ')
        def assignment___RSEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : BOEQ ')
        def assignment___BOEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : BAEQ ')
        def assignment___BAEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : XEQ ')
        def assignment___XEQ_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('assignment : SET ')
        def assignment___SET_(p):
            newNode = ParseTree("assignment",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation : collation_or ')
        def collation___collation_or_(p):
            newNode = ParseTree("collation",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_or : collation_and ')
        def collation_or___collation_and_(p):
            newNode = ParseTree("collation_or",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_or : collation_or OR collation_and ')
        def collation_or___collation_or_OR_collation_and_(p):
            newNode = ParseTree("collation_or",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_and : collation_bor ')
        def collation_and___collation_bor_(p):
            newNode = ParseTree("collation_and",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_and : collation_and AND collation_bor ')
        def collation_and___collation_and_AND_collation_bor_(p):
            newNode = ParseTree("collation_and",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_bor : collation_xor ')
        def collation_bor___collation_xor_(p):
            newNode = ParseTree("collation_bor",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_bor : collation_bor BOR collation_xor ')
        def collation_bor___collation_bor_BOR_collation_xor_(p):
            newNode = ParseTree("collation_bor",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_xor : collation_band ')
        def collation_xor___collation_band_(p):
            newNode = ParseTree("collation_xor",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_xor : collation_xor XOR collation_band ')
        def collation_xor___collation_xor_XOR_collation_band_(p):
            newNode = ParseTree("collation_xor",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_band : collation_eq ')
        def collation_band___collation_eq_(p):
            newNode = ParseTree("collation_band",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_band : collation_band BAND collation_eq ')
        def collation_band___collation_band_BAND_collation_eq_(p):
            newNode = ParseTree("collation_band",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_eq : collation_rel ')
        def collation_eq___collation_rel_(p):
            newNode = ParseTree("collation_eq",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_eq : collation_eq EQ collation_rel ')
        def collation_eq___collation_eq_EQ_collation_rel_(p):
            newNode = ParseTree("collation_eq",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_eq : collation_eq NEQ collation_rel ')
        def collation_eq___collation_eq_NEQ_collation_rel_(p):
            newNode = ParseTree("collation_eq",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_rel : arithmetic ')
        def collation_rel___arithmetic_(p):
            newNode = ParseTree("collation_rel",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_rel : collation_rel LT arithmetic ')
        def collation_rel___collation_rel_LT_arithmetic_(p):
            newNode = ParseTree("collation_rel",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_rel : collation_rel GT arithmetic ')
        def collation_rel___collation_rel_GT_arithmetic_(p):
            newNode = ParseTree("collation_rel",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_rel : collation_rel LEQ arithmetic ')
        def collation_rel___collation_rel_LEQ_arithmetic_(p):
            newNode = ParseTree("collation_rel",p)
            self.Head = newNode
            return newNode

        @self.pg.production('collation_rel : collation_rel GEQ arithmetic ')
        def collation_rel___collation_rel_GEQ_arithmetic_(p):
            newNode = ParseTree("collation_rel",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic : arithmetic_sh ')
        def arithmetic___arithmetic_sh_(p):
            newNode = ParseTree("arithmetic",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_sh : arithmetic_pm ')
        def arithmetic_sh___arithmetic_pm_(p):
            newNode = ParseTree("arithmetic_sh",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_sh : arithmetic_sh LSH arithmetic_pm ')
        def arithmetic_sh___arithmetic_sh_LSH_arithmetic_pm_(p):
            newNode = ParseTree("arithmetic_sh",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_sh : arithmetic_sh RSH arithmetic_pm ')
        def arithmetic_sh___arithmetic_sh_RSH_arithmetic_pm_(p):
            newNode = ParseTree("arithmetic_sh",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_pm : arithmetic_mul ')
        def arithmetic_pm___arithmetic_mul_(p):
            newNode = ParseTree("arithmetic_pm",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_pm : arithmetic_pm ADD arithmetic_mul ')
        def arithmetic_pm___arithmetic_pm_ADD_arithmetic_mul_(p):
            newNode = ParseTree("arithmetic_pm",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_pm : arithmetic_pm SUB arithmetic_mul ')
        def arithmetic_pm___arithmetic_pm_SUB_arithmetic_mul_(p):
            newNode = ParseTree("arithmetic_pm",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_mul : arithmetic_cast ')
        def arithmetic_mul___arithmetic_cast_(p):
            newNode = ParseTree("arithmetic_mul",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_mul : arithmetic_mul MUL arithmetic_cast ')
        def arithmetic_mul___arithmetic_mul_MUL_arithmetic_cast_(p):
            newNode = ParseTree("arithmetic_mul",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_mul : arithmetic_mul DIV arithmetic_cast ')
        def arithmetic_mul___arithmetic_mul_DIV_arithmetic_cast_(p):
            newNode = ParseTree("arithmetic_mul",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_mul : arithmetic_mul MOD arithmetic_cast ')
        def arithmetic_mul___arithmetic_mul_MOD_arithmetic_cast_(p):
            newNode = ParseTree("arithmetic_mul",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_cast : arithmetic_unary ')
        def arithmetic_cast___arithmetic_unary_(p):
            newNode = ParseTree("arithmetic_cast",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_cast : OPEN_PAREN var_type CLOSE_PAREN arithmetic_unary ')
        def arithmetic_cast___OPEN_PAREN_var_type_CLOSE_PAREN_arithmetic_unary_(p):
            newNode = ParseTree("arithmetic_cast",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_unary : arithmetic_post ')
        def arithmetic_unary___arithmetic_post_(p):
            newNode = ParseTree("arithmetic_unary",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_unary : INC var_access ')
        def arithmetic_unary___INC_var_access_(p):
            newNode = ParseTree("arithmetic_unary",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_unary : DEC var_access ')
        def arithmetic_unary___DEC_var_access_(p):
            newNode = ParseTree("arithmetic_unary",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_unary : unary_op arithmetic_cast ')
        def arithmetic_unary___unary_op_arithmetic_cast_(p):
            newNode = ParseTree("arithmetic_unary",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_unary : SIZEOF arithmetic_unary ')
        def arithmetic_unary___SIZEOF_arithmetic_unary_(p):
            newNode = ParseTree("arithmetic_unary",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_unary : SIZEOF var_type ')
        def arithmetic_unary___SIZEOF_var_type_(p):
            newNode = ParseTree("arithmetic_unary",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_post : value ')
        def arithmetic_post___value_(p):
            newNode = ParseTree("arithmetic_post",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_post : function_call ')
        def arithmetic_post___function_call_(p):
            newNode = ParseTree("arithmetic_post",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_post : var_access ')
        def arithmetic_post___var_access_(p):
            newNode = ParseTree("arithmetic_post",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_post : var_access INC ')
        def arithmetic_post___var_access_INC_(p):
            newNode = ParseTree("arithmetic_post",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_post : var_access DEC ')
        def arithmetic_post___var_access_DEC_(p):
            newNode = ParseTree("arithmetic_post",p)
            self.Head = newNode
            return newNode

        @self.pg.production('arithmetic_post : OPEN_PAREN collation CLOSE_PAREN ')
        def arithmetic_post___OPEN_PAREN_collation_CLOSE_PAREN_(p):
            newNode = ParseTree("arithmetic_post",p)
            self.Head = newNode
            return newNode

        @self.pg.production('unary_op : BAND ')
        def unary_op___BAND_(p):
            newNode = ParseTree("unary_op",p)
            self.Head = newNode
            return newNode

        @self.pg.production('unary_op : MUL ')
        def unary_op___MUL_(p):
            newNode = ParseTree("unary_op",p)
            self.Head = newNode
            return newNode

        @self.pg.production('unary_op : ADD ')
        def unary_op___ADD_(p):
            newNode = ParseTree("unary_op",p)
            self.Head = newNode
            return newNode

        @self.pg.production('unary_op : SUB ')
        def unary_op___SUB_(p):
            newNode = ParseTree("unary_op",p)
            self.Head = newNode
            return newNode

        @self.pg.production('unary_op : COMP ')
        def unary_op___COMP_(p):
            newNode = ParseTree("unary_op",p)
            self.Head = newNode
            return newNode

        @self.pg.production('unary_op : NOT ')
        def unary_op___NOT_(p):
            newNode = ParseTree("unary_op",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_access : SELF_DEFINED ')
        def var_access___SELF_DEFINED_(p):
            newNode = ParseTree("var_access",p)
            self.Head = newNode
            return newNode

        @self.pg.production('var_access : SELF_DEFINED OPEN_BRACK collation CLOSE_BRACK ')
        def var_access___SELF_DEFINED_OPEN_BRACK_collation_CLOSE_BRACK_(p):
            newNode = ParseTree("var_access",p)
            self.Head = newNode
            return newNode

        @self.pg.production('value : INTEGER ')
        def value___INTEGER_(p):
            newNode = ParseTree("value",p)
            self.Head = newNode
            return newNode

        @self.pg.production('value : PRECISION ')
        def value___PRECISION_(p):
            newNode = ParseTree("value",p)
            self.Head = newNode
            return newNode

        @self.pg.production('value : CHAR ')
        def value___CHAR_(p):
            newNode = ParseTree("value",p)
            self.Head = newNode
            return newNode

        @self.pg.production('value : HEX ')
        def value___HEX_(p):
            newNode = ParseTree("value",p)
            self.Head = newNode
            return newNode

        @self.pg.production('value : OCT ')
        def value___OCT_(p):
            newNode = ParseTree("value",p)
            self.Head = newNode
            return newNode

        @self.pg.production('value : BIN ')
        def value___BIN_(p):
            newNode = ParseTree("value",p)
            self.Head = newNode
            return newNode

        @self.pg.production('value : NULL ')
        def value___NULL_(p):
            newNode = ParseTree("value",p)
            self.Head = newNode
            return newNode


        @self.pg.error
        def error_handle(token):
            """
            Boilerplate error handling function

            Args:
                token: The token that caused an error.
            """
            return ValueError(token)

    #boilerplate function
    def get_parser(self):
        """
        Retrieves the built version of the parser.

        Returns:
            The built parser.
        """
        return self.pg.build()

    #retrieve the trees head
    def getTree(self):
        """
        Getter for the head of the tree.

        Returns:
            The head of the tree.
        """

        return self.Head

    def print_error(self):
        """
        Prints parser error message. This function ultimately iterates through the ParseTree that was returned after the parser found an error. ParseTree's consist of tokens as well as other ParseTree's so we need to iterate to find the first token and then print its source position.
        """
        # TODO: add some more in-depth error processing to print
        # out a more detailed description of what went wrong, and possibly some suggestions
        # at to why there was a parse/syntax error. (i.e. suggest a missing semicolon)

        head = self.getTree()
        token = 0 # token hasn't been found yet, so we set value to 0

        while True and head:
            # Iterate through list of elements
            for i in head.content:

                # Could be a Token
                if(type(i) == type(Token("sample", "sample"))):

                    # Found a Token
                    token = i
                    break

            # Check again (to break out of while loop and not iterate again)
            if (type(token) == type(Token("sample", "sample"))):
                break
            else:
                # Set head to last element.
                # If this code executes then I can assume that the
                # last element is an ParseTree.
                head = head.content[len(head.content)-1]

        if token:
            print(f"ParsingError: Last token  \'{token.value}\' parsed successfully at, {token.source_pos}\n")
        else:
            # Never found a token to report, need to exit
            print("ParsingError: No ParseTree obtained\n")
            exit()

Methods

def getTree(self)

Getter for the head of the tree.

Returns

The head of the tree.

Expand source code
def getTree(self):
    """
    Getter for the head of the tree.

    Returns:
        The head of the tree.
    """

    return self.Head
def get_parser(self)

Retrieves the built version of the parser.

Returns

The built parser.

Expand source code
def get_parser(self):
    """
    Retrieves the built version of the parser.

    Returns:
        The built parser.
    """
    return self.pg.build()
def parse(self)

The list of BNF functions and their behavior

Expand source code
def parse(self):
    """
    The list of BNF functions and their behavior
    """
    
    @self.pg.production('program : definitionList ')
    def program(p):
        """
        Tells the parser which BNF will be the head of the tree

        Args:
            p: The matching set of tokens.

        Returns:
            The node of the ParseTree.
        """
        newNode = ParseTree("program",p)
        self.Head = newNode
        return newNode

    @self.pg.production('definitionList : definition_terminal definitionList ')
    def definitionList___definition_terminal_definitionList_(p):
        newNode = ParseTree("definitionList",p)
        self.Head = newNode
        return newNode

    @self.pg.production('definitionList : definition_terminal ')
    def definitionList___definition_terminal_(p):
        newNode = ParseTree("definitionList",p)
        self.Head = newNode
        return newNode

    @self.pg.production('definition_terminal : functionDefinition ')
    def definition_terminal___functionDefinition_(p):
        newNode = ParseTree("definition_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('definition_terminal : functionDeclaration ')
    def definition_terminal___functionDeclaration_(p):
        newNode = ParseTree("definition_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('definition_terminal : initialization ')
    def definition_terminal___initialization_(p):
        newNode = ParseTree("definition_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('definition_terminal : COMMENT ')
    def definition_terminal___COMMENT_(p):
        newNode = ParseTree("definition_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('functionDefinition : func_type SELF_DEFINED OPEN_PAREN args CLOSE_PAREN block ')
    def functionDefinition___func_type_SELF_DEFINED_OPEN_PAREN_args_CLOSE_PAREN_block_(p):
        newNode = ParseTree("function definition",p)
        self.Head = newNode
        return newNode

    @self.pg.production('functionDefinition : func_type SELF_DEFINED OPEN_PAREN CLOSE_PAREN block ')
    def functionDefinition___func_type_SELF_DEFINED_OPEN_PAREN_CLOSE_PAREN_block_(p):
        newNode = ParseTree("function definition",p)
        self.Head = newNode
        return newNode

    @self.pg.production('functionDeclaration : func_type SELF_DEFINED OPEN_PAREN args CLOSE_PAREN SEMICOLON ')
    def functionDeclaration___func_type_SELF_DEFINED_OPEN_PAREN_args_CLOSE_PAREN_SEMICOLON_(p):
        newNode = ParseTree("functionDeclaration",p)
        self.Head = newNode
        return newNode

    @self.pg.production('functionDeclaration : func_type SELF_DEFINED OPEN_PAREN CLOSE_PAREN SEMICOLON ')
    def functionDeclaration___func_type_SELF_DEFINED_OPEN_PAREN_CLOSE_PAREN_SEMICOLON_(p):
        newNode = ParseTree("functionDeclaration",p)
        self.Head = newNode
        return newNode

    @self.pg.production('func_type : TYPE ')
    def func_type___TYPE_(p):
        newNode = ParseTree("func_type",p)
        self.Head = newNode
        return newNode

    @self.pg.production('func_type : func_modif TYPE ')
    def func_type___func_modif_TYPE_(p):
        newNode = ParseTree("func_type",p)
        self.Head = newNode
        return newNode

    @self.pg.production('func_modif : func_modif_terminal ')
    def func_modif___func_modif_terminal_(p):
        newNode = ParseTree("func_modif",p)
        self.Head = newNode
        return newNode

    @self.pg.production('func_modif : func_modif_terminal func_modif ')
    def func_modif___func_modif_terminal_func_modif_(p):
        newNode = ParseTree("func_modif",p)
        self.Head = newNode
        return newNode

    @self.pg.production('func_modif_terminal : FUNC_MODIF ')
    def func_modif_terminal___FUNC_MODIF_(p):
        newNode = ParseTree("func_modif_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('func_modif_terminal : BOTH_MODIF ')
    def func_modif_terminal___BOTH_MODIF_(p):
        newNode = ParseTree("func_modif_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('var_modif : var_modif_terminal ')
    def var_modif___var_modif_terminal_(p):
        newNode = ParseTree("var_modif",p)
        self.Head = newNode
        return newNode

    @self.pg.production('var_modif : var_modif_terminal var_modif ')
    def var_modif___var_modif_terminal_var_modif_(p):
        newNode = ParseTree("var_modif",p)
        self.Head = newNode
        return newNode

    @self.pg.production('var_modif_terminal : VAR_MODIF ')
    def var_modif_terminal___VAR_MODIF_(p):
        newNode = ParseTree("var_modif_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('var_modif_terminal : BOTH_MODIF ')
    def var_modif_terminal___BOTH_MODIF_(p):
        newNode = ParseTree("var_modif_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('args : arg_terminal COMMA args ')
    def args___arg_terminal_COMMA_args_(p):
        newNode = ParseTree("args",p)
        self.Head = newNode
        return newNode

    @self.pg.production('args : arg_terminal ')
    def args___arg_terminal_(p):
        newNode = ParseTree("args",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arg_terminal : var_type SELF_DEFINED ')
    def arg_terminal___var_type_SELF_DEFINED_(p):
        newNode = ParseTree("arg_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arg_terminal : var_type SELF_DEFINED OPEN_BRACK CLOSE_BRACK ')
    def arg_terminal___var_type_SELF_DEFINED_OPEN_BRACK_CLOSE_BRACK_(p):
        newNode = ParseTree("arg_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arg_terminal : var_type ')
    def arg_terminal___var_type_(p):
        newNode = ParseTree("arg_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('block : OPEN_BRACE content CLOSE_BRACE ')
    def block___OPEN_BRACE_content_CLOSE_BRACE_(p):
        newNode = ParseTree("block",p)
        self.Head = newNode
        return newNode

    @self.pg.production('block : OPEN_BRACE CLOSE_BRACE ')
    def block___OPEN_BRACE_CLOSE_BRACE_(p):
        newNode = ParseTree("block",p)
        self.Head = newNode
        return newNode

    @self.pg.production('content : content_terminal content ')
    def content___content_terminal_content_(p):
        newNode = ParseTree("content",p)
        self.Head = newNode
        return newNode

    @self.pg.production('content : content_terminal ')
    def content___content_terminal_(p):
        newNode = ParseTree("content",p)
        self.Head = newNode
        return newNode

    @self.pg.production('content_terminal : single_line ')
    def content_terminal___single_line_(p):
        newNode = ParseTree("content_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('content_terminal : loop ')
    def content_terminal___loop_(p):
        newNode = ParseTree("content_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('content_terminal : branch ')
    def content_terminal___branch_(p):
        newNode = ParseTree("content_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('content_terminal : goto ')
    def content_terminal___goto_(p):
        newNode = ParseTree("content_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('content_terminal : COMMENT ')
    def content_terminal___COMMENT_(p):
        newNode = ParseTree("content_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('content_terminal : block ')
    def content_terminal___block_(p):
        newNode = ParseTree("content_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('single_line : initialization SEMICOLON ')
    def single_line___initialization_SEMICOLON_(p):
        newNode = ParseTree("single_line",p)
        self.Head = newNode
        return newNode

    @self.pg.production('single_line : function_call SEMICOLON ')
    def single_line___function_call_SEMICOLON_(p):
        newNode = ParseTree("single_line",p)
        self.Head = newNode
        return newNode

    @self.pg.production('single_line : designation SEMICOLON ')
    def single_line___designation_SEMICOLON_(p):
        newNode = ParseTree("single_line",p)
        self.Head = newNode
        return newNode

    @self.pg.production('single_line : response SEMICOLON ')
    def single_line___response_SEMICOLON_(p):
        newNode = ParseTree("single_line",p)
        self.Head = newNode
        return newNode

    @self.pg.production('single_line : collation SEMICOLON ')
    def single_line___collation_SEMICOLON_(p):
        newNode = ParseTree("single_line",p)
        self.Head = newNode
        return newNode

    @self.pg.production('single_line : SEMICOLON ')
    def single_line___SEMICOLON_(p):
        newNode = ParseTree("single_line",p)
        self.Head = newNode
        return newNode

    @self.pg.production('function_call : SELF_DEFINED OPEN_PAREN param CLOSE_PAREN ')
    def function_call___SELF_DEFINED_OPEN_PAREN_param_CLOSE_PAREN_(p):
        newNode = ParseTree("function call",p)
        self.Head = newNode
        return newNode

    @self.pg.production('function_call : SELF_DEFINED OPEN_PAREN CLOSE_PAREN ')
    def function_call___SELF_DEFINED_OPEN_PAREN_CLOSE_PAREN_(p):
        newNode = ParseTree("function call",p)
        self.Head = newNode
        return newNode

    @self.pg.production('string_literal : STRING ')
    def string_literal___STRING_(p):
        newNode = ParseTree("string literal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('param : param_terminal ')
    def param___param_terminal_(p):
        newNode = ParseTree("parameter",p)
        self.Head = newNode
        return newNode

    @self.pg.production('param : param_terminal COMMA param ')
    def param___param_terminal_COMMA_param_(p):
        newNode = ParseTree("parameter",p)
        self.Head = newNode
        return newNode

    @self.pg.production('param_terminal : arithmetic ')
    def param_terminal___arithmetic_(p):
        newNode = ParseTree("param_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('param_terminal : STRING ')
    def param_terminal___STRING_(p):
        newNode = ParseTree("param_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('loop : WHILE_LOOP OPEN_PAREN collation CLOSE_PAREN content_terminal ')
    def loop___WHILE_LOOP_OPEN_PAREN_collation_CLOSE_PAREN_content_terminal_(p):
        newNode = ParseTree("while loop",p)
        self.Head = newNode
        return newNode

    @self.pg.production('loop : FOR_LOOP OPEN_PAREN for_part_1 SEMICOLON for_part_2 SEMICOLON for_part_3 CLOSE_PAREN content_terminal ')
    def loop___FOR_LOOP_OPEN_PAREN_for_part_1_SEMICOLON_for_part_2_SEMICOLON_for_part_3_CLOSE_PAREN_content_terminal_(p):
        newNode = ParseTree("for loop",p)
        self.Head = newNode
        return newNode

    @self.pg.production('loop : DO_LOOP content_terminal WHILE_LOOP OPEN_PAREN collation CLOSE_PAREN SEMICOLON ')
    def loop___DO_LOOP_content_terminal_WHILE_LOOP_OPEN_PAREN_collation_CLOSE_PAREN_SEMICOLON_(p):
        newNode = ParseTree("do loop",p)
        self.Head = newNode
        return newNode

    @self.pg.production('branch : IF_BRANCH OPEN_PAREN collation CLOSE_PAREN if_body')
    def branch___IF_BRANCH_OPEN_PAREN_collation_CLOSE_PAREN_if_body(p):
        newNode = ParseTree("if",p)
        self.Head = newNode
        return newNode

    @self.pg.production('branch : IF_BRANCH OPEN_PAREN collation CLOSE_PAREN if_body if_expansion ')
    def branch___IF_BRANCH_OPEN_PAREN_collation_CLOSE_PAREN_if_body_if_expansion_(p):
        newNode = ParseTree("if",p)
        self.Head = newNode
        return newNode

    @self.pg.production('if_body : content_terminal ')
    def if_body___content_terminal_(p):
        newNode = ParseTree("if_body",p)
        self.Head = newNode
        return newNode

    @self.pg.production('if_expansion : ELSE_BRANCH if_body ')
    def if_expansion___ELSE_BRANCH_if_body_(p):
        newNode = ParseTree("if_expansion",p)
        self.Head = newNode
        return newNode

    @self.pg.production('branch : SWITCH_BRANCH OPEN_PAREN arithmetic CLOSE_PAREN switch_body ')
    def branch___SWITCH_BRANCH_OPEN_PAREN_arithmetic_CLOSE_PAREN_switch_body_(p):
        newNode = ParseTree("switch",p)
        self.Head = newNode
        return newNode

    @self.pg.production('switch_body : OPEN_BRACE case CLOSE_BRACE ')
    def switch_body___OPEN_BRACE_case_CLOSE_BRACE_(p):
        newNode = ParseTree("switch_body",p)
        self.Head = newNode
        return newNode

    @self.pg.production('switch_body : OPEN_BRACE cases CLOSE_BRACE ')
    def switch_body___OPEN_BRACE_cases_CLOSE_BRACE_(p):
        newNode = ParseTree("switch_body",p)
        self.Head = newNode
        return newNode

    @self.pg.production('cases : case cases ')
    def cases___case_cases_(p):
        newNode = ParseTree("cases",p)
        self.Head = newNode
        return newNode

    @self.pg.production('cases : case ')
    def cases___case_(p):
        newNode = ParseTree("cases",p)
        self.Head = newNode
        return newNode

    @self.pg.production('cases : default ')
    def cases___default_(p):
        newNode = ParseTree("cases",p)
        self.Head = newNode
        return newNode

    @self.pg.production('case : CASE value COLON ')
    def case___CASE_value_COLON_(p):
        newNode = ParseTree("case",p)
        self.Head = newNode
        return newNode

    @self.pg.production('case : CASE value COLON case_body ')
    def case___CASE_value_COLON_case_body_(p):
        newNode = ParseTree("case",p)
        self.Head = newNode
        return newNode

    @self.pg.production('default : DEFAULT COLON ')
    def default___DEFAULT_COLON_(p):
        newNode = ParseTree("default",p)
        self.Head = newNode
        return newNode

    @self.pg.production('default : DEFAULT COLON case_body ')
    def default___DEFAULT_COLON_case_body_(p):
        newNode = ParseTree("default",p)
        self.Head = newNode
        return newNode

    @self.pg.production('case_body : content ')
    def case_body___content_(p):
        newNode = ParseTree("case_body",p)
        self.Head = newNode
        return newNode

    @self.pg.production('goto : SELF_DEFINED COLON content_terminal ')
    def goto___SELF_DEFINED_COLON_content_terminal_(p):
        newNode = ParseTree("goto",p)
        self.Head = newNode
        return newNode

    @self.pg.production('goto : SELF_DEFINED COLON ')
    def goto___SELF_DEFINED_COLON_(p):
        newNode = ParseTree("goto",p)
        self.Head = newNode
        return newNode

    @self.pg.production('response : RETURN collation ')
    def response___RETURN_collation_(p):
        newNode = ParseTree("return",p)
        self.Head = newNode
        return newNode

    @self.pg.production('response : RETURN ')
    def response___RETURN_(p):
        newNode = ParseTree("return",p)
        self.Head = newNode
        return newNode

    @self.pg.production('response : GOTO SELF_DEFINED ')
    def response___GOTO_SELF_DEFINED_(p):
        newNode = ParseTree("jump",p)
        self.Head = newNode
        return newNode

    @self.pg.production('response : BREAK ')
    def response___BREAK_(p):
        newNode = ParseTree("break",p)
        self.Head = newNode
        return newNode

    @self.pg.production('response : CONTINUE ')
    def response___CONTINUE_(p):
        newNode = ParseTree("continue",p)
        self.Head = newNode
        return newNode

    @self.pg.production('initialization : var_type SELF_DEFINED SET initialization_terminal ')
    def initialization___var_type_SELF_DEFINED_SET_initialization_terminal_(p):
        newNode = ParseTree("initialization",p)
        self.Head = newNode
        return newNode

    @self.pg.production('initialization : var_type SELF_DEFINED ')
    def initialization___var_type_SELF_DEFINED_(p):
        newNode = ParseTree("initialization",p)
        self.Head = newNode
        return newNode

    @self.pg.production('initialization : var_type SELF_DEFINED OPEN_BRACK INTEGER CLOSE_BRACK ')
    def initialization___var_type_SELF_DEFINED_OPEN_BRACK_INTEGER_CLOSE_BRACK_(p):
        newNode = ParseTree("initialization",p)
        self.Head = newNode
        return newNode

    @self.pg.production('initialization : var_type MUL designation ')
    def initialization___var_type_MUL_designation_(p):
        newNode = ParseTree("initialization",p)
        self.Head = newNode
        return newNode

    @self.pg.production('initialization : var_type SELF_DEFINED array_init SET initialization_terminal ')
    def initialization___var_type_SELF_DEFINED_array_init_SET_initialization_terminal_(p):
        newNode = ParseTree("initialization",p)
        self.Head = newNode
        return newNode

    @self.pg.production('initialization : var_type SELF_DEFINED array_init assignment OPEN_BRACE arr_list CLOSE_BRACE ')
    def initialization___var_type_SELF_DEFINED_array_init_assignment_OPEN_BRACE_arr_list_CLOSE_BRACE_(p):
        newNode = ParseTree("initialization",p)
        self.Head = newNode
        return newNode

    @self.pg.production('array_init : OPEN_BRACK INTEGER CLOSE_BRACK ')
    def array_init___OPEN_BRACK_INTEGER_CLOSE_BRACK_(p):
        newNode = ParseTree("array_init",p)
        self.Head = newNode
        return newNode

    @self.pg.production('array_init : OPEN_BRACK CLOSE_BRACK ')
    def array_init___OPEN_BRACK_CLOSE_BRACK_(p):
        newNode = ParseTree("array_init",p)
        self.Head = newNode
        return newNode

    @self.pg.production('initialization_terminal : collation ')
    def initialization_terminal___collation_(p):
        newNode = ParseTree("initialization_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('initialization_terminal : string_literal ')
    def initialization_terminal___string_literal_(p):
        newNode = ParseTree("initialization_terminal",p)
        self.Head = newNode
        return newNode

    @self.pg.production('var_type : var_modif TYPE ')
    def var_type___var_modif_TYPE_(p):
        newNode = ParseTree("var_type",p)
        self.Head = newNode
        return newNode

    @self.pg.production('var_type : TYPE ')
    def var_type___TYPE_(p):
        newNode = ParseTree("var_type",p)
        self.Head = newNode
        return newNode

    @self.pg.production('for_part_1 : initialization ')
    def for_part_1___initialization_(p):
        newNode = ParseTree("for param 1",p)
        self.Head = newNode
        return newNode

    @self.pg.production('for_part_1 : ')
    def for_part_1___(p):
        newNode = ParseTree("for param 1",p)
        self.Head = newNode
        return newNode

    @self.pg.production('for_part_1 : designation ')
    def for_part_1___designation_(p):
        newNode = ParseTree("for param 1",p)
        self.Head = newNode
        return newNode

    @self.pg.production('for_part_2 : collation ')
    def for_part_2___collation_(p):
        newNode = ParseTree("for param 2",p)
        self.Head = newNode
        return newNode

    @self.pg.production('for_part_2 : ')
    def for_part_2___(p):
        newNode = ParseTree("for param 2",p)
        self.Head = newNode
        return newNode

    @self.pg.production('for_part_3 : designation ')
    def for_part_3___designation_(p):
        newNode = ParseTree("for param 3",p)
        self.Head = newNode
        return newNode

    @self.pg.production('for_part_3 : arithmetic ')
    def for_part_3___arithmetic_(p):
        newNode = ParseTree("for param 3",p)
        self.Head = newNode
        return newNode

    @self.pg.production('for_part_3 : ')
    def for_part_3___(p):
        newNode = ParseTree("for param 3",p)
        self.Head = newNode
        return newNode

    @self.pg.production('designation : var_access assignment collation ')
    def designation___var_access_assignment_collation_(p):
        newNode = ParseTree("designation",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arr_list : collation ')
    def arr_list___collation_(p):
        newNode = ParseTree("arr_list",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arr_list : collation COMMA arr_list ')
    def arr_list___collation_COMMA_arr_list_(p):
        newNode = ParseTree("arr_list",p)
        self.Head = newNode
        return newNode

    @self.pg.production('assignment : AEQ ')
    def assignment___AEQ_(p):
        newNode = ParseTree("assignment",p)
        self.Head = newNode
        return newNode

    @self.pg.production('assignment : SEQ ')
    def assignment___SEQ_(p):
        newNode = ParseTree("assignment",p)
        self.Head = newNode
        return newNode

    @self.pg.production('assignment : MEQ ')
    def assignment___MEQ_(p):
        newNode = ParseTree("assignment",p)
        self.Head = newNode
        return newNode

    @self.pg.production('assignment : DEQ ')
    def assignment___DEQ_(p):
        newNode = ParseTree("assignment",p)
        self.Head = newNode
        return newNode

    @self.pg.production('assignment : MODEQ ')
    def assignment___MODEQ_(p):
        newNode = ParseTree("assignment",p)
        self.Head = newNode
        return newNode

    @self.pg.production('assignment : LSEQ ')
    def assignment___LSEQ_(p):
        newNode = ParseTree("assignment",p)
        self.Head = newNode
        return newNode

    @self.pg.production('assignment : RSEQ ')
    def assignment___RSEQ_(p):
        newNode = ParseTree("assignment",p)
        self.Head = newNode
        return newNode

    @self.pg.production('assignment : BOEQ ')
    def assignment___BOEQ_(p):
        newNode = ParseTree("assignment",p)
        self.Head = newNode
        return newNode

    @self.pg.production('assignment : BAEQ ')
    def assignment___BAEQ_(p):
        newNode = ParseTree("assignment",p)
        self.Head = newNode
        return newNode

    @self.pg.production('assignment : XEQ ')
    def assignment___XEQ_(p):
        newNode = ParseTree("assignment",p)
        self.Head = newNode
        return newNode

    @self.pg.production('assignment : SET ')
    def assignment___SET_(p):
        newNode = ParseTree("assignment",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation : collation_or ')
    def collation___collation_or_(p):
        newNode = ParseTree("collation",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_or : collation_and ')
    def collation_or___collation_and_(p):
        newNode = ParseTree("collation_or",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_or : collation_or OR collation_and ')
    def collation_or___collation_or_OR_collation_and_(p):
        newNode = ParseTree("collation_or",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_and : collation_bor ')
    def collation_and___collation_bor_(p):
        newNode = ParseTree("collation_and",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_and : collation_and AND collation_bor ')
    def collation_and___collation_and_AND_collation_bor_(p):
        newNode = ParseTree("collation_and",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_bor : collation_xor ')
    def collation_bor___collation_xor_(p):
        newNode = ParseTree("collation_bor",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_bor : collation_bor BOR collation_xor ')
    def collation_bor___collation_bor_BOR_collation_xor_(p):
        newNode = ParseTree("collation_bor",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_xor : collation_band ')
    def collation_xor___collation_band_(p):
        newNode = ParseTree("collation_xor",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_xor : collation_xor XOR collation_band ')
    def collation_xor___collation_xor_XOR_collation_band_(p):
        newNode = ParseTree("collation_xor",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_band : collation_eq ')
    def collation_band___collation_eq_(p):
        newNode = ParseTree("collation_band",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_band : collation_band BAND collation_eq ')
    def collation_band___collation_band_BAND_collation_eq_(p):
        newNode = ParseTree("collation_band",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_eq : collation_rel ')
    def collation_eq___collation_rel_(p):
        newNode = ParseTree("collation_eq",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_eq : collation_eq EQ collation_rel ')
    def collation_eq___collation_eq_EQ_collation_rel_(p):
        newNode = ParseTree("collation_eq",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_eq : collation_eq NEQ collation_rel ')
    def collation_eq___collation_eq_NEQ_collation_rel_(p):
        newNode = ParseTree("collation_eq",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_rel : arithmetic ')
    def collation_rel___arithmetic_(p):
        newNode = ParseTree("collation_rel",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_rel : collation_rel LT arithmetic ')
    def collation_rel___collation_rel_LT_arithmetic_(p):
        newNode = ParseTree("collation_rel",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_rel : collation_rel GT arithmetic ')
    def collation_rel___collation_rel_GT_arithmetic_(p):
        newNode = ParseTree("collation_rel",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_rel : collation_rel LEQ arithmetic ')
    def collation_rel___collation_rel_LEQ_arithmetic_(p):
        newNode = ParseTree("collation_rel",p)
        self.Head = newNode
        return newNode

    @self.pg.production('collation_rel : collation_rel GEQ arithmetic ')
    def collation_rel___collation_rel_GEQ_arithmetic_(p):
        newNode = ParseTree("collation_rel",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic : arithmetic_sh ')
    def arithmetic___arithmetic_sh_(p):
        newNode = ParseTree("arithmetic",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_sh : arithmetic_pm ')
    def arithmetic_sh___arithmetic_pm_(p):
        newNode = ParseTree("arithmetic_sh",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_sh : arithmetic_sh LSH arithmetic_pm ')
    def arithmetic_sh___arithmetic_sh_LSH_arithmetic_pm_(p):
        newNode = ParseTree("arithmetic_sh",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_sh : arithmetic_sh RSH arithmetic_pm ')
    def arithmetic_sh___arithmetic_sh_RSH_arithmetic_pm_(p):
        newNode = ParseTree("arithmetic_sh",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_pm : arithmetic_mul ')
    def arithmetic_pm___arithmetic_mul_(p):
        newNode = ParseTree("arithmetic_pm",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_pm : arithmetic_pm ADD arithmetic_mul ')
    def arithmetic_pm___arithmetic_pm_ADD_arithmetic_mul_(p):
        newNode = ParseTree("arithmetic_pm",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_pm : arithmetic_pm SUB arithmetic_mul ')
    def arithmetic_pm___arithmetic_pm_SUB_arithmetic_mul_(p):
        newNode = ParseTree("arithmetic_pm",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_mul : arithmetic_cast ')
    def arithmetic_mul___arithmetic_cast_(p):
        newNode = ParseTree("arithmetic_mul",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_mul : arithmetic_mul MUL arithmetic_cast ')
    def arithmetic_mul___arithmetic_mul_MUL_arithmetic_cast_(p):
        newNode = ParseTree("arithmetic_mul",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_mul : arithmetic_mul DIV arithmetic_cast ')
    def arithmetic_mul___arithmetic_mul_DIV_arithmetic_cast_(p):
        newNode = ParseTree("arithmetic_mul",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_mul : arithmetic_mul MOD arithmetic_cast ')
    def arithmetic_mul___arithmetic_mul_MOD_arithmetic_cast_(p):
        newNode = ParseTree("arithmetic_mul",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_cast : arithmetic_unary ')
    def arithmetic_cast___arithmetic_unary_(p):
        newNode = ParseTree("arithmetic_cast",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_cast : OPEN_PAREN var_type CLOSE_PAREN arithmetic_unary ')
    def arithmetic_cast___OPEN_PAREN_var_type_CLOSE_PAREN_arithmetic_unary_(p):
        newNode = ParseTree("arithmetic_cast",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_unary : arithmetic_post ')
    def arithmetic_unary___arithmetic_post_(p):
        newNode = ParseTree("arithmetic_unary",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_unary : INC var_access ')
    def arithmetic_unary___INC_var_access_(p):
        newNode = ParseTree("arithmetic_unary",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_unary : DEC var_access ')
    def arithmetic_unary___DEC_var_access_(p):
        newNode = ParseTree("arithmetic_unary",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_unary : unary_op arithmetic_cast ')
    def arithmetic_unary___unary_op_arithmetic_cast_(p):
        newNode = ParseTree("arithmetic_unary",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_unary : SIZEOF arithmetic_unary ')
    def arithmetic_unary___SIZEOF_arithmetic_unary_(p):
        newNode = ParseTree("arithmetic_unary",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_unary : SIZEOF var_type ')
    def arithmetic_unary___SIZEOF_var_type_(p):
        newNode = ParseTree("arithmetic_unary",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_post : value ')
    def arithmetic_post___value_(p):
        newNode = ParseTree("arithmetic_post",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_post : function_call ')
    def arithmetic_post___function_call_(p):
        newNode = ParseTree("arithmetic_post",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_post : var_access ')
    def arithmetic_post___var_access_(p):
        newNode = ParseTree("arithmetic_post",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_post : var_access INC ')
    def arithmetic_post___var_access_INC_(p):
        newNode = ParseTree("arithmetic_post",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_post : var_access DEC ')
    def arithmetic_post___var_access_DEC_(p):
        newNode = ParseTree("arithmetic_post",p)
        self.Head = newNode
        return newNode

    @self.pg.production('arithmetic_post : OPEN_PAREN collation CLOSE_PAREN ')
    def arithmetic_post___OPEN_PAREN_collation_CLOSE_PAREN_(p):
        newNode = ParseTree("arithmetic_post",p)
        self.Head = newNode
        return newNode

    @self.pg.production('unary_op : BAND ')
    def unary_op___BAND_(p):
        newNode = ParseTree("unary_op",p)
        self.Head = newNode
        return newNode

    @self.pg.production('unary_op : MUL ')
    def unary_op___MUL_(p):
        newNode = ParseTree("unary_op",p)
        self.Head = newNode
        return newNode

    @self.pg.production('unary_op : ADD ')
    def unary_op___ADD_(p):
        newNode = ParseTree("unary_op",p)
        self.Head = newNode
        return newNode

    @self.pg.production('unary_op : SUB ')
    def unary_op___SUB_(p):
        newNode = ParseTree("unary_op",p)
        self.Head = newNode
        return newNode

    @self.pg.production('unary_op : COMP ')
    def unary_op___COMP_(p):
        newNode = ParseTree("unary_op",p)
        self.Head = newNode
        return newNode

    @self.pg.production('unary_op : NOT ')
    def unary_op___NOT_(p):
        newNode = ParseTree("unary_op",p)
        self.Head = newNode
        return newNode

    @self.pg.production('var_access : SELF_DEFINED ')
    def var_access___SELF_DEFINED_(p):
        newNode = ParseTree("var_access",p)
        self.Head = newNode
        return newNode

    @self.pg.production('var_access : SELF_DEFINED OPEN_BRACK collation CLOSE_BRACK ')
    def var_access___SELF_DEFINED_OPEN_BRACK_collation_CLOSE_BRACK_(p):
        newNode = ParseTree("var_access",p)
        self.Head = newNode
        return newNode

    @self.pg.production('value : INTEGER ')
    def value___INTEGER_(p):
        newNode = ParseTree("value",p)
        self.Head = newNode
        return newNode

    @self.pg.production('value : PRECISION ')
    def value___PRECISION_(p):
        newNode = ParseTree("value",p)
        self.Head = newNode
        return newNode

    @self.pg.production('value : CHAR ')
    def value___CHAR_(p):
        newNode = ParseTree("value",p)
        self.Head = newNode
        return newNode

    @self.pg.production('value : HEX ')
    def value___HEX_(p):
        newNode = ParseTree("value",p)
        self.Head = newNode
        return newNode

    @self.pg.production('value : OCT ')
    def value___OCT_(p):
        newNode = ParseTree("value",p)
        self.Head = newNode
        return newNode

    @self.pg.production('value : BIN ')
    def value___BIN_(p):
        newNode = ParseTree("value",p)
        self.Head = newNode
        return newNode

    @self.pg.production('value : NULL ')
    def value___NULL_(p):
        newNode = ParseTree("value",p)
        self.Head = newNode
        return newNode


    @self.pg.error
    def error_handle(token):
        """
        Boilerplate error handling function

        Args:
            token: The token that caused an error.
        """
        return ValueError(token)
def print_error(self)

Prints parser error message. This function ultimately iterates through the ParseTree that was returned after the parser found an error. ParseTree's consist of tokens as well as other ParseTree's so we need to iterate to find the first token and then print its source position.

Expand source code
def print_error(self):
    """
    Prints parser error message. This function ultimately iterates through the ParseTree that was returned after the parser found an error. ParseTree's consist of tokens as well as other ParseTree's so we need to iterate to find the first token and then print its source position.
    """
    # TODO: add some more in-depth error processing to print
    # out a more detailed description of what went wrong, and possibly some suggestions
    # at to why there was a parse/syntax error. (i.e. suggest a missing semicolon)

    head = self.getTree()
    token = 0 # token hasn't been found yet, so we set value to 0

    while True and head:
        # Iterate through list of elements
        for i in head.content:

            # Could be a Token
            if(type(i) == type(Token("sample", "sample"))):

                # Found a Token
                token = i
                break

        # Check again (to break out of while loop and not iterate again)
        if (type(token) == type(Token("sample", "sample"))):
            break
        else:
            # Set head to last element.
            # If this code executes then I can assume that the
            # last element is an ParseTree.
            head = head.content[len(head.content)-1]

    if token:
        print(f"ParsingError: Last token  \'{token.value}\' parsed successfully at, {token.source_pos}\n")
    else:
        # Never found a token to report, need to exit
        print("ParsingError: No ParseTree obtained\n")
        exit()