Пример #1
0
 def parse_while_stat(lexer):
     lexer.get_next_token_of_kind(TokenKind.KW_WHILE)
     exp = ExpParser.parse_exp(lexer)
     lexer.get_next_token_of_kind(TokenKind.KW_DO)
     block = Parser.parse_block(lexer)
     lexer.get_next_token_of_kind(TokenKind.KW_END)
     return lua_stat.WhileStat(exp, block)
Пример #2
0
 def finish_for_in_stat(lexer, name):
     name_list = StatParser.finish_name_list(lexer, name)
     lexer.get_next_token_of_kind(TokenKind.KW_IN)
     exp_list = ExpParser.parse_exp_list(lexer)
     line_of_do, _ = lexer.get_next_token_of_kind(TokenKind.KW_DO)
     block = Parser.parse_block(lexer)
     lexer.get_next_token_of_kind(TokenKind.KW_END)
     return lua_stat.ForInStat(line_of_do, name_list, exp_list, block)
Пример #3
0
 def parse_func_def_exp(lexer):
     from compiler.parser import Parser
     line = lexer.get_line()
     lexer.get_next_token_of_kind(TokenKind.SEP_LPAREN)
     par_list, is_var_arg = ExpParser.parse_par_list(lexer)
     lexer.get_next_token_of_kind(TokenKind.SEP_RPAREN)
     block = Parser.parse_block(lexer)
     last_line, _ = lexer.get_next_token_of_kind(TokenKind.KW_END)
     return lua_exp.FuncDefExp(line, last_line, par_list, is_var_arg, block)
Пример #4
0
 def compile(chunk, chunk_name):
     parser = Parser()
     lexer = Lexer(chunk, chunk_name)
     ast = parser.parse_block(lexer)
     # print(ast)
     proto = Codegen.gen_proto(ast)
     # proto.print_code()
     LuaCompiler.set_source(proto, chunk_name)
     return proto
Пример #5
0
    def parse_if_stat(lexer):
        exps = []
        blocks = []

        lexer.get_next_token_of_kind(TokenKind.KW_IF)
        exps.append(ExpParser.parse_exp(lexer))
        lexer.get_next_token_of_kind(TokenKind.KW_THEN)
        blocks.append(Parser.parse_block(lexer))

        while lexer.look_ahead() == TokenKind.KW_ELSEIF:
            lexer.get_next_token()
            exps.append(ExpParser.parse_exp(lexer))
            lexer.get_next_token_of_kind(TokenKind.KW_THEN)
            blocks.append(Parser.parse_block(lexer))

        if lexer.look_ahead() == TokenKind.KW_ELSE:
            lexer.get_next_token()
            exps.append(lua_exp.TrueExp(lexer.get_line()))
            blocks.append(Parser.parse_block(lexer))

        lexer.get_next_token_of_kind(TokenKind.KW_END)
        return lua_stat.IfStat(exps, blocks)
Пример #6
0
    def finish_for_num_stat(lexer, line_of_for, var_name):
        lexer.get_next_token_of_kind(TokenKind.OP_ASSIGN)
        init_exp = ExpParser.parse_exp(lexer)
        lexer.get_next_token_of_kind(TokenKind.SEP_COMMA)
        limit_exp = ExpParser.parse_exp(lexer)

        if lexer.look_ahead() == TokenKind.SEP_COMMA:
            lexer.get_next_token()
            step_exp = ExpParser.parse_exp(lexer)
        else:
            step_exp = lua_exp.IntegerExp(lexer.get_line(), 1)

        line_of_do, _ = lexer.get_next_token_of_kind(TokenKind.KW_DO)
        block = Parser.parse_block(lexer)
        lexer.get_next_token_of_kind(TokenKind.KW_END)

        return lua_stat.ForNumStat(line_of_for, line_of_do, var_name, init_exp,
                                   limit_exp, step_exp, block)
Пример #7
0
 def parse_repeat_stat(lexer):
     lexer.get_next_token_of_kind(TokenKind.KW_REPEAT)
     block = Parser.parse_block(lexer)
     lexer.get_next_token_of_kind(TokenKind.KW_UNTIL)
     exp = ExpParser.parse_exp(lexer)
     return lua_stat.RepeatStat(block, exp)
Пример #8
0
 def parse_do_stat(lexer):
     lexer.get_next_token_of_kind(TokenKind.KW_DO)
     block = Parser.parse_block(lexer)
     lexer.get_next_token_of_kind(TokenKind.KW_END)
     return lua_stat.DoStat(block)
Пример #9
0
def test_parser(chunk, chunkname):
    parser = Parser()
    lexer = Lexer(chunk, chunkname)
    ast = parser.parse_block(lexer)
    print(ast)