def testNegatedNumber(self): lxr = lexer.Lexer(version=4) lxr._process_line(b'-1.234567890e-6\n') self.assertEqual(3, len(lxr._tokens)) self.assertEqual(lexer.TokSymbol(b'-'), lxr._tokens[0]) self.assertEqual(lexer.TokNumber(b'1.234567890e-6'), lxr._tokens[1])
def testRequireWalkerOptionsTable(self): ast = lua.Lua.from_lines([ b'print("hi")', b'require("foo", {use_game_loop=true})', b'x = 7\n'], 8) result = list(build.RequireWalker(ast.tokens, ast.root).walk()) self.assertEquals(1, len(result)) self.assertEquals((b'foo', True, lexer.TokSymbol(b'(')), result[0])
def testRequireWalkerExpression(self): ast = lua.Lua.from_lines([ b'print("hi")', b'foomod = require("foo")', b'x = 7\n'], 8) result = list(build.RequireWalker(ast.tokens, ast.root).walk()) self.assertEquals(1, len(result)) self.assertEquals((b'foo', False, lexer.TokSymbol(b'(')), result[0])
def testValidLuaNoErrors(self): lxr = lexer.Lexer(version=4) for line in VALID_LUA.split(b'\n'): lxr._process_line(line) tokens = lxr.tokens self.assertEqual(lexer.TokName(b'v1'), tokens[0]) self.assertEqual(lexer.TokSpace(b' '), tokens[1]) self.assertEqual(lexer.TokSymbol(b'='), tokens[2]) self.assertEqual(lexer.TokSpace(b' '), tokens[3]) self.assertEqual(lexer.TokKeyword(b'nil'), tokens[4])
def testCursorAccept(self): p = get_parser('break name 7.42 -- Comment text\n"string literal" ==') self.assertEqual(0, p._pos) self.assertIsNone(p._accept(lexer.TokName)) self.assertIsNone(p._accept(lexer.TokKeyword('and'))) self.assertIsNotNone(p._accept(lexer.TokKeyword('break'))) self.assertEqual(1, p._pos) self.assertIsNotNone(p._accept(lexer.TokName)) self.assertIsNotNone(p._accept(lexer.TokNumber)) self.assertIsNotNone(p._accept(lexer.TokString)) self.assertIsNotNone(p._accept(lexer.TokSymbol('=='))) self.assertEqual(11, p._pos)
def testCursorAcceptStopsAtMaxPos(self): p = get_parser(b'break name 7.42 -- Comment text\n"string literal" ==') p._max_pos = 4 self.assertEqual(0, p._pos) self.assertIsNone(p._accept(lexer.TokName)) self.assertIsNone(p._accept(lexer.TokKeyword(b'and'))) self.assertIsNotNone(p._accept(lexer.TokKeyword(b'break'))) self.assertEqual(1, p._pos) self.assertIsNotNone(p._accept(lexer.TokName)) self.assertIsNone(p._accept(lexer.TokNumber)) self.assertIsNone(p._accept(lexer.TokString)) self.assertIsNone(p._accept(lexer.TokSymbol(b'=='))) self.assertEqual(3, p._pos)
def testStatAssignment(self): p = get_parser('foo, bar, baz = 1, 2, 3') node = p._stat() self.assertIsNotNone(node) self.assertEqual(17, p._pos) self.assertEqual(3, len(node.varlist.vars)) self.assertEqual('foo', node.varlist.vars[0].name.value) self.assertEqual('bar', node.varlist.vars[1].name.value) self.assertEqual('baz', node.varlist.vars[2].name.value) self.assertTrue(node.assignop.matches(lexer.TokSymbol('='))) self.assertEqual(3, len(node.explist.exps)) self.assertTrue(node.explist.exps[0].value.matches( lexer.TokNumber('1'))) self.assertTrue(node.explist.exps[1].value.matches( lexer.TokNumber('2'))) self.assertTrue(node.explist.exps[2].value.matches( lexer.TokNumber('3')))
def main(orig_args): arg_parser = _get_argparser() args = arg_parser.parse_args(args=orig_args) assert args.lua.endswith('.lua') game_fname = args.lua[:-len('.lua')] + '.p8' my_game = game.Game.make_empty_game(filename=game_fname) my_lexer = lexer.Lexer(version=4) with open(args.lua, 'rb') as lua_fh: my_lexer.process_lines(lua_fh) my_textlib = lzwlib.LzwLib(start_addr=args.startaddr, end_addr=args.endaddr) saw_star = False for i, token in enumerate(my_lexer._tokens): if token.matches(lexer.TokSymbol(b'*')): saw_star = True elif token.matches(lexer.TokString) and saw_star: sid = my_textlib.id_for_string(token.value.decode()) my_lexer._tokens[i - 1] = lexer.TokSpace(b'') my_lexer._tokens[i] = lexer.TokString(str.encode(sid)) saw_star = False else: saw_star = False textlib_lua = str.encode(my_textlib.generate_lua()) my_lexer.process_lines([(l + b'\n') for l in textlib_lua.split(b'\n')]) my_game.lua._lexer = my_lexer my_game.lua._parser.process_tokens(my_game.lua._lexer.tokens) text_bytes = my_textlib.as_bytes() my_game.write_cart_data(text_bytes, args.startaddr) with open(game_fname, 'wb') as outstr: my_game.to_p8_file(outstr, filename=game_fname) return 0
def testStatAssignmentAnonymousFunctionTable(self): p = get_parser(''' player = { init=function(this) print(t1) end, update=function(this) print(t2) end, draw=function(this) print(t3) end } ''') node = p._stat() self.assertIsNotNone(node) self.assertEqual(61, p._pos) self.assertEqual(1, len(node.varlist.vars)) self.assertEqual('player', node.varlist.vars[0].name.value) self.assertTrue(node.assignop.matches(lexer.TokSymbol('='))) self.assertEqual(1, len(node.explist.exps)) self.assertEqual(3, len(node.explist.exps[0].value.fields)) self.assertEqual('init', node.explist.exps[0].value.fields[0].key_name.value) self.assertTrue( isinstance(node.explist.exps[0].value.fields[0].exp.value, parser.Function)) self.assertEqual('update', node.explist.exps[0].value.fields[1].key_name.value) self.assertTrue( isinstance(node.explist.exps[0].value.fields[1].exp.value, parser.Function)) self.assertEqual('draw', node.explist.exps[0].value.fields[2].key_name.value) self.assertTrue( isinstance(node.explist.exps[0].value.fields[2].exp.value, parser.Function))
def testThreeDots(self): lxr = lexer.Lexer(version=4) lxr._process_line(b'...\n') self.assertEqual(2, len(lxr._tokens)) self.assertEqual(lexer.TokSymbol(b'...'), lxr._tokens[0])