]>
Commit | Line | Data |
---|---|---|
933e60e3 JW |
1 | function errprint(s) |
2 | io.stderr:write(s.."\n") | |
3 | end | |
4 | ||
5 | function deparse(parsetree) | |
6 | function printtable(spaces, tbl) | |
7 | if table.getn(tbl) == 1 and tbl[1] then | |
8 | printtable(spaces, tbl[1]) | |
9 | return | |
10 | end | |
11 | if tbl.type == "function" then | |
12 | errprint(spaces.."function: "..tbl.name) | |
13 | errprint(spaces.." returns: "..tbl.returntype) | |
14 | errprint(spaces.." args: ") | |
15 | for k,v in pairs(tbl.args) do | |
16 | printtable(spaces.." ",v) | |
17 | end | |
18 | errprint(spaces.." body: ") | |
19 | printtable(spaces.." ", tbl.body) | |
20 | elseif tbl.type == "stmtlist" then | |
21 | errprint(spaces.."stmtlist:") | |
22 | for k,v in pairs(tbl.body) do | |
23 | errprint(spaces.." "..k..":") | |
24 | printtable(spaces.." ", v) | |
25 | end | |
26 | elseif tbl.type == "variable" then | |
27 | errprint(spaces.."variable: "..tbl.vtype.." "..tbl.name.." = "..tostring(tbl.initializer)) | |
28 | elseif tbl.type == "expression" then | |
29 | errprint(spaces.."expression") | |
30 | printtable(spaces.." ",tbl.value) | |
31 | elseif tbl.type == "operator" then | |
32 | errprint(spaces.."operator \""..tbl.value.."\"") | |
33 | errprint(spaces.." left: ") | |
34 | printtable(spaces.." ", tbl.left) | |
35 | errprint(spaces.." right: ") | |
36 | printtable(spaces.." ", tbl.right) | |
37 | elseif tbl.type == "number" or tbl.type == "identifier" then | |
38 | errprint(spaces..tbl.type.." "..tbl.value) | |
39 | elseif tbl.type == "while" then | |
40 | errprint(spaces.."while") | |
41 | errprint(spaces.." expression:") | |
42 | printtable(spaces.." ", tbl.expression) | |
43 | errprint(spaces.." chunk:") | |
44 | printtable(spaces.." ", tbl.chunk) | |
45 | else | |
46 | ignored = { ["parent"] = true } | |
47 | for k,v in pairs(tbl) do | |
48 | if type(v) ~= "table" then | |
49 | errprint(spaces..k..": "..v) | |
50 | end | |
51 | end | |
52 | for k,v in pairs(tbl) do | |
53 | if type(v) == "table" and not ignored[k] then | |
54 | if k == "v" then | |
55 | printtable(spaces, v) | |
56 | else | |
57 | errprint(spaces..k..":") | |
58 | printtable(spaces.." ",v) | |
59 | end | |
60 | end | |
61 | end | |
62 | end | |
63 | end | |
64 | printtable("", parsetree) | |
65 | end |