Skip to content

Commit 530ba7a

Browse files
committed
render: wip
1 parent b0d9717 commit 530ba7a

File tree

2 files changed

+107
-2
lines changed

2 files changed

+107
-2
lines changed

bsc/lua_ast/__init__.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,28 @@ def __init__(self, name, args):
2525
self.args = args
2626
self.stmts = []
2727

28+
# Statements
29+
30+
class LuaWhile:
31+
def __init__(self, cond, stmts):
32+
self.cond = cond
33+
self.stmts = stmts
34+
35+
class LuaRepeat:
36+
def __init__(self, stmts, cond):
37+
self.stmts = stmts
38+
self.cond = cond
39+
40+
class LuaIf:
41+
def __init__(self, branches):
42+
self.branches = branches
43+
44+
class LuaIfBranch:
45+
def __init__(self, cond, is_else, stmts):
46+
self.cond = cond
47+
self.is_else = is_else
48+
self.stmts = stmts
49+
2850
class LuaBlock:
2951
def __init__(self):
3052
self.chunk = []
@@ -35,9 +57,33 @@ def __init__(self, lefts, op, rights):
3557
self.op = op
3658
self.rights = rights
3759

60+
# Expressions
61+
62+
class LuaCallExpr:
63+
def __init__(self, left, args):
64+
self.left = left
65+
self.args = args
66+
67+
class LuaSelector:
68+
def __init__(self, left, name):
69+
self.left = left
70+
self.name = name
71+
3872
class LuaIdent:
3973
def __init__(self, name):
4074
self.name = name
4175

76+
class LuaParenExpr:
77+
def __init__(self, expr):
78+
self.expr = expr
79+
80+
class LuaNumberLit:
81+
def __init__(self, value):
82+
self.value = value
83+
84+
class LuaBooleanLit:
85+
def __init__(self, value):
86+
self.value = value
87+
4288
class LuaNil:
4389
pass

bsc/lua_ast/render.py

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,69 @@ def render_fn_decl(self, decl):
8383
if i < len(decl.args) - 1:
8484
self.write(", ")
8585
self.writeln(")")
86-
#self.indent += 1
87-
#self.indent -= 1
86+
self.indent += 1
87+
self.render_stmts(decl.stmts)
88+
self.indent -= 1
8889
self.writeln("end\n")
8990

91+
def render_stmts(self, stmts):
92+
for stmt in stmts:
93+
self.render_stmt(stmt)
94+
95+
def render_stmt(self, stmt):
96+
if isinstance(stmt, LuaWhile):
97+
self.write("while ")
98+
self.render_expr(stmt.cond)
99+
self.writeln(" do")
100+
self.indent += 1
101+
self.render_stmts(stmt.stmts)
102+
self.indent -= 1
103+
self.writeln("end")
104+
elif isinstance(stmt, LuaRepeat):
105+
self.writeln("repeat")
106+
self.indent += 1
107+
self.render_stmts(stmt.stmts)
108+
self.indent -= 1
109+
self.write("until ")
110+
self.render_expr(stmt.cond)
111+
self.writeln()
112+
elif isinstance(stmt, LuaIf):
113+
for i, branch in enumerate(stmt.branches):
114+
if branch.is_else:
115+
self.writeln("else")
116+
else:
117+
self.write("if " if i == 0 else "elseif ")
118+
self.render_expr(branch.cond)
119+
self.indent += 1
120+
self.render_stmts(branch.stmts)
121+
self.indent -= 1
122+
self.writeln("end")
123+
124+
def render_expr(self, expr):
125+
if isinstance(expr, LuaParenExpr):
126+
self.write("(")
127+
self.render_expr(expr.expr)
128+
self.write(")")
129+
elif isinstance(expr, LuaCallExpr):
130+
self.render_expr(expr.left)
131+
self.write("(")
132+
for i, arg in enumerate(expr.args):
133+
self.render_expr(arg)
134+
if i < len(expr.args) - 1:
135+
self.write(", ")
136+
self.write(")")
137+
elif isinstance(expr, LuaSelector):
138+
self.render_expr(expr.left)
139+
self.write(f".{expr.name}")
140+
elif isinstance(expr, LuaIdent):
141+
self.write(expr.name)
142+
elif isinstance(expr, (LuaBooleanLit, LuaNumberLit)):
143+
self.write(expr.value)
144+
elif isinstance(expr, LuaNil):
145+
self.write("nil")
146+
147+
## Utils
148+
90149
def write(self, s):
91150
if self.indent > 0 and self.empty_line:
92151
self.lua_file.write("\t" * self.indent)

0 commit comments

Comments
 (0)