コード例 #1
0
def if_statement_inner_part(token):
    # if statement inner part
    print_token(token[0], token[1])
    token = tokanizer.next_token()
    if token[0] == "{":
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        if token[0] != "}":
            token = statements(token)
            # token = tokanizer.next_token()
        if token[0] == "}":
            print_token(token[0], token[1])
            # token = tokanizer.next_token()
        if token[0] == "else":
            print_token(token[0], token[1])
            token = tokanizer.next_token()
            if token[0] == "{":
                print_token(token[0], token[1])
                token = tokanizer.next_token()
            if token[0] != "}":
                token = statements(token)
                token = tokanizer.next_token()
            if token[0] == "}":
                print_token(token[0], token[1])
    return token
コード例 #2
0
def subroutine_dec_body(token):
    # subroutine_dec Body part
    if token[0] == "(":
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        token = parameter_list(token)
    if token[0] == ")":
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        return token
コード例 #3
0
def class_body(token):
    # Body of a class Method
    if token[0] == "static" or token[0] == "field":
        while token[0] == "static" or token[0] == "field":
            token = class_var_dec(token)
            token = tokanizer.next_token()
    if token[0] == "constructor" or token[0] == "function" or token[0] == "method" or token[0] == "void":
        while token[0] == "constructor" or token[0] == "function" or token[0] == "method" or token[0] == "void":
            token = subroutine_dec(token)
            token = tokanizer.next_token()
    return token
コード例 #4
0
def do_statement(token):
    # do statement, Grammer: 'do' subroutineCall ';'
    print "<doStatement>"
    print_token(token[0], token[1])
    token = tokanizer.next_token()
    token = subroutine_call(token)
    token = tokanizer.next_token()
    if token[0] == ";":
        print_token(token[0], token[1])
    print "</doStatement>"
    return token
コード例 #5
0
def return_statement(token):
    # return statement, Grammer: 'return' expession? ';'
    print "<returnSatement>"
    print_token(token[0], token[1])
    token = tokanizer.next_token()
    if token[0] != ";":
        token = expression(token)
        token = tokanizer.next_token()
    if token[0] == ";":
        print_token(token[0], token[1])
    print "</returnStatement>"
    return token
コード例 #6
0
def subroutine_call_body(token):
    # Subroutine call body
    if token[0] == "(":
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        token = expression_list(token)
        if token[0] != ")":
            token = tokanizer.next_token()
        if token[0] == ")":
            print_token(token[0], token[1])
            # token = tokanizer.next_token()
    return token
コード例 #7
0
def subroutine_call(token):
    # Subroutine call,Grammer: subroutineName '(' expressionList ')' | ( className | varName) '.' subroutineName '(' expressionList ')'
    if token[1] == "identifier":
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        token = subroutine_call_body(token)
        if token[0] == ".":
            print_token(token[0], token[1])
            token = tokanizer.next_token()
            if token[1] == "identifier":
                print_token(token[0], token[1])
                token = tokanizer.next_token()
                token = subroutine_call_body(token)
    return token
コード例 #8
0
def expression_list(token):
    # Expression List, Grammer: (expression (',' expression)* )?
    print "<expressionList>"
    if token[0] != ")":
        token = expression(token)
        tmp_tkn = tokanizer.next_token_temp()
        if tmp_tkn[0] == ",":
            token = tokanizer.next_token()
            while token[0] == ",":
                print_token(token[0], token[1])
                token = tokanizer.next_token()
                token = expression(token)
                token = tokanizer.next_token()
    print "</expressionList>"
    return token
コード例 #9
0
def if_statement(token):
    # if statement, Grammer: 'if' '(' expression ')' '{' statements '}'
    print "<ifStatement>"
    print_token(token[0], token[1])
    token = tokanizer.next_token()
    if token[0] == "(":
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        if token[0] != ")":
            token = expression(token)
            token = tokanizer.next_token()
        if token[0] == ")":
            token = if_statement_inner_part(token)
    print "</ifStatement>"
    return token
コード例 #10
0
def while_statement_inner_part(token):
    # While statement inner part
    token = tokanizer.next_token()
    token = expression(token)
    token = tokanizer.next_token()
    if token[0] == ")":
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        if token[0] == "{":
            print_token(token[0], token[1])
            token = tokanizer.next_token()
            token = statements(token)
            if token[0] == "}":
                print_token(token[0], token[1])
    return token
コード例 #11
0
def subroutine_dec(token):
    # Subroutine Declaration, Grammer: ('constructor' | 'function' | 'method') ('void' | type) subroutineName '(' parameterList ')' subroutineBody
    print "<subroutineDec>"
    if token[0] == "constructor" or token[0] == "function" or token[0] == "method":
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        if token[0] == "void" or token[0] == basic_type(token):
            print_token(token[0], token[1])
            token = tokanizer.next_token()
            if token[1] == "identifier":
                print_token(token[0], token[1])
                token = tokanizer.next_token()
                token = subroutine_dec_body(token)
    token = subroutine_body(token)
    print "</subroutineDec>"
    return token
コード例 #12
0
def statements(token):
    # Check whether the token is a statement ot not, Grammer: statement*
    print "<statements>"
    while token[0] == "if" or token[0] == "while" or token[0] == "do" or token[0] == "let" or token[0] == "return":
        token = statement(token)
        token = tokanizer.next_token()
    print "</statements>"
    return token
コード例 #13
0
def class_method():
    # Class Declaration, Grammer:  'class' className '{' classVarDec* subroutineDec* '}'
    print "<class>"
    token = tokanizer.next_token()
    if token[0] == "class":
        print_token(token[0], token[1])
    token = tokanizer.next_token()
    if token[1] == "identifier":
        print_token(token[0], token[1])
    token = tokanizer.next_token()
    if token[0] == "{":
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        token = class_body(token)
    if token[0] == "}":
        print_token(token[0], token[1])
    print "</class>"
コード例 #14
0
def inside_subroutine_body(token):
    while token[0] == "var":
        if token[0] == "var":
            token = var_dec(token)
        token = tokanizer.next_token()
    if token[0] != "var":
        token = statements(token)
        # token = next_token(tokanized_pgm)
    return token
コード例 #15
0
def expression(token):
    # Expressions, Grammer: term (op term)*
    print "<expression>"
    token = term(token)
    tmp_tkn = tokanizer.next_token_temp()
    t_type_o = op_checking(tmp_tkn[0])
    if t_type_o == "op":
        token = tokanizer.next_token()
        while t_type_o == "op":
            print_token(token[0], token[1])
            token = tokanizer.next_token()
            token = term(token)
            tmp_tkn = tokanizer.next_token_temp()
            t_type_o = op_checking(tmp_tkn)
            if t_type_o == "op":
                token = tokanizer.next_token()
    print "</expression>"
    return token
コード例 #16
0
def var_dec(token):
    # Variable Declaration Method,Grammer: 'var' type varName (',' varName)* ';'
    print "<varDec>"
    print_token(token[0], token[1])
    token = tokanizer.next_token()
    if token[0] == basic_type(token) or tokanizer.token_type(token[0]) == "identifier":
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        var_dec_token_type(token)
        token = tokanizer.next_token()
        while token[0] != ";":
            if token[0] == ",":
                print_token(token[0], token[1])
                token = tokanizer.next_token()
                var_dec_token_type(token)
            token = tokanizer.next_token()
        if token[0] == ";":
            print_token(token[0], token[1])
    print "</varDec>"
    return token
コード例 #17
0
def subroutine_body(token):
    # Subroutine Body, Grammer: '{' varDec* statements '}'
    print "<subroutineBody>"
    if token[0] == "{":
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        token = inside_subroutine_body(token)
        if token[0] == "}":
            print_token(token[0], token[1])
    print "</subroutineBody>"
    return token
コード例 #18
0
def while_statement(token):
    # While tatement, Grammer: 'while' '(' expression ')' '{' statements  '}'
    print "<whileStatement>"
    if token[0] == "while":
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        if token[0] == "(":
            print_token(token[0], token[1])
            token = while_statement_inner_part(token)
    print "</whileStatement>"
    return token
コード例 #19
0
def parameter_list(token):
    # Parameter List, Grammer: ( (type varName) (',' type varName)*)?
    print "<parameterList>"
    if token[0] == basic_type(token):
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        if token[1] == "identifier":
            print_token(token[0], token[1])
            token = tokanizer.next_token()
            while token[0] == ",":
                print_token(token[0], token[1])
                token = tokanizer.next_token()
                if token[0] == basic_type(token):
                    print_token(token[0], token[1])
                    token = tokanizer.next_token()
                if token[1] == "identifier":
                    print_token(token[0], token[1])
                token = tokanizer.next_token()
    print "</parameterList>"
    return token
コード例 #20
0
def class_var_dec(token):
    # Class variable Declaration, Grammer: ('static' | 'field' ) type varName (',' varName)* ';'
    print "<classVarDec>"
    print_token(token[0], token[1])
    token = tokanizer.next_token()
    if token[0] == basic_type(token) or token[1] == "identifier":
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        if token[1] == "identifier":
            print_token(token[0], token[1])
            token = tokanizer.next_token()
            while token[0] == ",":
                print_token(token[0], token[1])
                token = tokanizer.next_token()
                if token[1] == "identifier":
                    print_token(token[0], token[1])
                    token = tokanizer.next_token()
            if token[0] == ";":
                print_token(token[0], token[1])
    print "</classVarDec>"
    return token
コード例 #21
0
def term(token):
    # term, Grammer: integerConstant | stringConstant | keywordConstant | varName | varName '[' expression ']' | subroutineCall | '(' expression ')' | unaryOp term
    print "<term>"
    if token[1] == "integerConstant" or token[1] == "stringConstant":
        print_token(token[0], token[1])
    if token[1] == "keyword":
        print_token(token[0], token[1])
    if token[1] == "identifier":
        tmp_token = tokanizer.next_token_temp()
        if tmp_token[0] != "." and tmp_token[0] != "(" and tmp_token[0] != "[":
            print_token(token[0], token[1])
        if tmp_token[0] == "[":
            print_token(token[0], token[1])
            token = tokanizer.next_token()
            if token[0] == "[":
                print_token(token[0], token[1])
                token = tokanizer.next_token()
            token = expression(token)
            token = tokanizer.next_token()
            if token[0] == "]":
                print_token(token[0], token[1])
        if tmp_token[0] == "(" or tmp_token[0] == ".":
            """ print_token(token[0], token[1])
            token = tokanizer.next_token()
            print_token(token[0], token[1])
            token = tokanizer.next_token()"""
            token = subroutine_call(token)
    t_type = keyword_constant_checking(token[0])
    if t_type == "keywordConstant":
        print_token(token[0], token[1])
    if token[0] == "(":
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        token = expression(token)
        token = tokanizer.next_token()
        if token[0] == ")":
            print_token(token[0], token[1])
    if token[0] == "~" or token[0] == "-":
        print_token(token[0], "unaryOp")
        token = tokanizer.next_token()
        token = term(token)
    print "</term>"
    return token
コード例 #22
0
def let_statement(token):
    # let statemetns operations, Grammer: 'let' varName ('[' expression ']')? '=' expression ';'
    print "<letStatement>"
    print_token(token[0], token[1])
    token = tokanizer.next_token()
    if token[1] == "identifier":
        print_token(token[0], token[1])
        token = tokanizer.next_token()
        if token[0] == "[":
            print_token(token[0], token[1])
            token = tokanizer.next_token()
            token = expression(token)
            token = let_statement_inner_part(token)
            token = tokanizer.next_token()
        if token[0] == "=":
            print_token(token[0], token[1])
            token = tokanizer.next_token()
            token = expression(token)
            token = tokanizer.next_token()
            if token[0] == ";":
                print_token(token[0], token[1])
    print "</letStatement>"
    return token
コード例 #23
0
def let_statement_inner_part(token):
    # Let statement innerpart, calling experssion if any occerence found
    token = tokanizer.next_token()
    if token[0] == "]":
        print_token(token[0], token[1])
    return token