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)
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)
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)
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
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)
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)
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)
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)
def test_parser(chunk, chunkname): parser = Parser() lexer = Lexer(chunk, chunkname) ast = parser.parse_block(lexer) print(ast)