minify/lparser.lua

Thu, 27 May 2010 04:29:28 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Thu, 27 May 2010 04:29:28 +0100
changeset 61
b8af42b7ddf8
parent 1
2d9fe676e684
child 85
347ac1733354
permissions
-rw-r--r--

README: Add gzip

1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 --[[--------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 lparser.lua: Lua 5.1 parser in Lua
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 This file is part of LuaSrcDiet, based on Yueliang material.
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 Copyright (c) 2008 Kein-Hong Man <khman@users.sf.net>
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 The COPYRIGHT file describes the conditions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 under which this software may be distributed.
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 See the ChangeLog for more information.
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 ----------------------------------------------------------------------]]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 --[[--------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 -- NOTES:
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 -- * This is a version of the native 5.1.x parser from Yueliang 0.4.0,
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 -- with significant modifications to handle LuaSrcDiet's needs:
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 -- (1) needs pre-built token tables instead of a module.method
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 -- (2) lparser.error is an optional error handler (from llex)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 -- (3) not full parsing, currently fakes raw/unlexed constants
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 -- (4) parser() returns globalinfo, localinfo tables
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 -- * Please read technotes.txt for more technical details.
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 -- * NO support for 'arg' vararg functions (LUA_COMPAT_VARARG)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 -- * A lot of the parser is unused, but might later be useful for
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 -- full-on parsing and analysis for a few measly bytes saved.
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 ----------------------------------------------------------------------]]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 local base = _G
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 local string = require "string"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 module "lparser"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 local _G = base.getfenv()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 --[[--------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 -- variable and data structure initialization
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 ----------------------------------------------------------------------]]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 -- initialization: main variables
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 local toklist, -- grammar-only token tables (token table,
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 seminfolist, -- semantic information table, line number
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 toklnlist, -- table, cross-reference table)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 xreflist,
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 tpos, -- token position
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 line, -- start line # for error messages
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 lastln, -- last line # for ambiguous syntax chk
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 tok, seminfo, ln, xref, -- token, semantic info, line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 nameref, -- proper position of <name> token
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 fs, -- current function state
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 top_fs, -- top-level function state
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 globalinfo, -- global variable information table
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 globallookup, -- global variable name lookup table
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 localinfo, -- local variable information table
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 ilocalinfo, -- inactive locals (prior to activation)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 ilocalrefs -- corresponding references to activate
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 -- forward references for local functions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 local explist1, expr, block, exp1, body, chunk
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 -- initialization: data structures
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 local gmatch = string.gmatch
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 local block_follow = {} -- lookahead check in chunk(), returnstat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 for v in gmatch("else elseif end until <eof>", "%S+") do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 block_follow[v] = true
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 local stat_call = {} -- lookup for calls in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 for v in gmatch("if while do for repeat function local return break", "%S+") do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 stat_call[v] = v.."_stat"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 local binopr_left = {} -- binary operators, left priority
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 local binopr_right = {} -- binary operators, right priority
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 for op, lt, rt in gmatch([[
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 {+ 6 6}{- 6 6}{* 7 7}{/ 7 7}{% 7 7}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 {^ 10 9}{.. 5 4}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 {~= 3 3}{== 3 3}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 {< 3 3}{<= 3 3}{> 3 3}{>= 3 3}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 {and 2 2}{or 1 1}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 ]], "{(%S+)%s(%d+)%s(%d+)}") do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 binopr_left[op] = lt + 0
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 binopr_right[op] = rt + 0
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 local unopr = { ["not"] = true, ["-"] = true,
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 ["#"] = true, } -- unary operators
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 local UNARY_PRIORITY = 8 -- priority for unary operators
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 --[[--------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 -- support functions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 ----------------------------------------------------------------------]]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 -- formats error message and throws error (duplicated from llex)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 -- * a simplified version, does not report what token was responsible
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 local function errorline(s, line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 local e = error or base.error
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 e(string.format("(source):%d: %s", line or ln, s))
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 -- handles incoming token, semantic information pairs
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 -- * NOTE: 'nextt' is named 'next' originally
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 -- reads in next token
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 local function nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 lastln = toklnlist[tpos]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 tok, seminfo, ln, xref
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 = toklist[tpos], seminfolist[tpos], toklnlist[tpos], xreflist[tpos]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 tpos = tpos + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 -- peek at next token (single lookahead for table constructor)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 local function lookahead()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 return toklist[tpos]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 -- throws a syntax error, or if token expected is not there
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
131
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 local function syntaxerror(msg)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 local tok = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 if tok ~= "<number>" and tok ~= "<string>" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135 if tok == "<name>" then tok = seminfo end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 tok = "'"..tok.."'"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 errorline(msg.." near "..tok)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
141 local function error_expected(token)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 syntaxerror("'"..token.."' expected")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
143 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
144
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
145 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 -- tests for a token, returns outcome
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 -- * return value changed to boolean
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 local function testnext(c)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 if tok == c then nextt(); return true end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
153
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
154 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
155 -- check for existence of a token, throws error if not found
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 local function check(c)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159 if tok ~= c then error_expected(c) end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
162 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
163 -- verify existence of a token, then skip it
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 local function checknext(c)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167 check(c); nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171 -- throws error if condition not matched
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174 local function check_condition(c, msg)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 if not c then syntaxerror(msg) end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
178 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179 -- verifies token conditions are met or else throw error
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
180 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
181
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
182 local function check_match(what, who, where)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183 if not testnext(what) then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184 if where == ln then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185 error_expected(what)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
186 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
187 syntaxerror("'"..what.."' expected (to close '"..who.."' at line "..where..")")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
188 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
189 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
190 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
191
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
192 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
193 -- expect that token is a name, return the name
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
194 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
195
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 local function str_checkname()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197 check("<name>")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
198 local ts = seminfo
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
199 nameref = xref
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
200 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
201 return ts
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
202 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
203
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
204 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
205 -- adds given string s in string pool, sets e as VK
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
206 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
207
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
208 local function codestring(e, s)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209 e.k = "VK"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
210 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
211
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
212 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
213 -- consume a name token, adds it to string pool
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
214 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
215
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
216 local function checkname(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
217 codestring(e, str_checkname())
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
218 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
219
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
220 --[[--------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
221 -- variable (global|local|upvalue) handling
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
222 -- * to track locals and globals, we can extend Yueliang's minimal
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
223 -- variable management code with little trouble
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
224 -- * entry point is singlevar() for variable lookups
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
225 -- * lookup tables (bl.locallist) are maintained awkwardly in the basic
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
226 -- block data structures, PLUS the function data structure (this is
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
227 -- an inelegant hack, since bl is nil for the top level of a function)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
228 ----------------------------------------------------------------------]]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
229
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
230 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
231 -- register a local variable, create local variable object, set in
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
232 -- to-activate variable list
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
233 -- * used in new_localvarliteral(), parlist(), fornum(), forlist(),
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
234 -- localfunc(), localstat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
235 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
236
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
237 local function new_localvar(name, special)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
238 local bl = fs.bl
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
239 local locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
240 -- locate locallist in current block object or function root object
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
241 if bl then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
242 locallist = bl.locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
243 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
244 locallist = fs.locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
245 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
246 -- build local variable information object and set localinfo
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
247 local id = #localinfo + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
248 localinfo[id] = { -- new local variable object
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
249 name = name, -- local variable name
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
250 xref = { nameref }, -- xref, first value is declaration
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
251 decl = nameref, -- location of declaration, = xref[1]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
252 }
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
253 if special then -- "self" must be not be changed
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
254 localinfo[id].isself = true
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
256 -- this can override a local with the same name in the same scope
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
257 -- but first, keep it inactive until it gets activated
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
258 local i = #ilocalinfo + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259 ilocalinfo[i] = id
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
260 ilocalrefs[i] = locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
261 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
262
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
263 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
264 -- actually activate the variables so that they are visible
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
265 -- * remember Lua semantics, e.g. RHS is evaluated first, then LHS
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
266 -- * used in parlist(), forbody(), localfunc(), localstat(), body()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
267 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
268
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
269 local function adjustlocalvars(nvars)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
270 local sz = #ilocalinfo
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
271 -- i goes from left to right, in order of local allocation, because
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
272 -- of something like: local a,a,a = 1,2,3 which gives a = 3
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
273 while nvars > 0 do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
274 nvars = nvars - 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
275 local i = sz - nvars
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
276 local id = ilocalinfo[i] -- local's id
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
277 local obj = localinfo[id]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
278 local name = obj.name -- name of local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
279 obj.act = xref -- set activation location
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
280 ilocalinfo[i] = nil
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
281 local locallist = ilocalrefs[i] -- ref to lookup table to update
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
282 ilocalrefs[i] = nil
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
283 local existing = locallist[name] -- if existing, remove old first!
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
284 if existing then -- do not overlap, set special
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
285 obj = localinfo[existing] -- form of rem, as -id
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
286 obj.rem = -id
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
287 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
288 locallist[name] = id -- activate, now visible to Lua
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
289 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
290 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
291
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
292 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
293 -- remove (deactivate) variables in current scope (before scope exits)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
294 -- * zap entire locallist tables since we are not allocating registers
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
295 -- * used in leaveblock(), close_func()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
296 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
297
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
298 local function removevars()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
299 local bl = fs.bl
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
300 local locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
301 -- locate locallist in current block object or function root object
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
302 if bl then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
303 locallist = bl.locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
304 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
305 locallist = fs.locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
306 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
307 -- enumerate the local list at current scope and deactivate 'em
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
308 for name, id in base.pairs(locallist) do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
309 local obj = localinfo[id]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
310 obj.rem = xref -- set deactivation location
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
311 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
312 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
313
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
314 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
315 -- creates a new local variable given a name
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
316 -- * skips internal locals (those starting with '('), so internal
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
317 -- locals never needs a corresponding adjustlocalvars() call
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
318 -- * special is true for "self" which must not be optimized
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
319 -- * used in fornum(), forlist(), parlist(), body()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
320 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
321
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
322 local function new_localvarliteral(name, special)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
323 if string.sub(name, 1, 1) == "(" then -- can skip internal locals
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
324 return
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
325 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
326 new_localvar(name, special)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
327 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
328
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
329 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
330 -- search the local variable namespace of the given fs for a match
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
331 -- * returns localinfo index
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
332 -- * used only in singlevaraux()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
333 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
334
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
335 local function searchvar(fs, n)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
336 local bl = fs.bl
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
337 local locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
338 if bl then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
339 locallist = bl.locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
340 while locallist do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
341 if locallist[n] then return locallist[n] end -- found
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
342 bl = bl.prev
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
343 locallist = bl and bl.locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
344 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
345 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
346 locallist = fs.locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
347 return locallist[n] or -1 -- found or not found (-1)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
348 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
349
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
350 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
351 -- handle locals, globals and upvalues and related processing
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
352 -- * search mechanism is recursive, calls itself to search parents
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
353 -- * used only in singlevar()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
354 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
355
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
356 local function singlevaraux(fs, n, var)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
357 if fs == nil then -- no more levels?
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
358 var.k = "VGLOBAL" -- default is global variable
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
359 return "VGLOBAL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
360 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
361 local v = searchvar(fs, n) -- look up at current level
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
362 if v >= 0 then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
363 var.k = "VLOCAL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
364 var.id = v
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
365 -- codegen may need to deal with upvalue here
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
366 return "VLOCAL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
367 else -- not found at current level; try upper one
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
368 if singlevaraux(fs.prev, n, var) == "VGLOBAL" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
369 return "VGLOBAL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
370 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
371 -- else was LOCAL or UPVAL, handle here
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
372 var.k = "VUPVAL" -- upvalue in this level
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
373 return "VUPVAL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
374 end--if v
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
375 end--if fs
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
376 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
377
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
378 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
379 -- consume a name token, creates a variable (global|local|upvalue)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
380 -- * used in prefixexp(), funcname()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
381 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
382
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
383 local function singlevar(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
384 local name = str_checkname()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
385 singlevaraux(fs, name, v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
386 ------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
387 -- variable tracking
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
388 ------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
389 if v.k == "VGLOBAL" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
390 -- if global being accessed, keep track of it by creating an object
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
391 local id = globallookup[name]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
392 if not id then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
393 id = #globalinfo + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
394 globalinfo[id] = { -- new global variable object
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
395 name = name, -- global variable name
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
396 xref = { nameref }, -- xref, first value is declaration
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
397 }
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
398 globallookup[name] = id -- remember it
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
399 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
400 local obj = globalinfo[id].xref
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
401 obj[#obj + 1] = nameref -- add xref
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
402 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
403 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
404 -- local/upvalue is being accessed, keep track of it
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
405 local id = v.id
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
406 local obj = localinfo[id].xref
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
407 obj[#obj + 1] = nameref -- add xref
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
408 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
409 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
410
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
411 --[[--------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
412 -- state management functions with open/close pairs
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
413 ----------------------------------------------------------------------]]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
414
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
415 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
416 -- enters a code unit, initializes elements
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
417 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
418
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
419 local function enterblock(isbreakable)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
420 local bl = {} -- per-block state
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
421 bl.isbreakable = isbreakable
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
422 bl.prev = fs.bl
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
423 bl.locallist = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
424 fs.bl = bl
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
425 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
426
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
427 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
428 -- leaves a code unit, close any upvalues
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
429 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
430
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
431 local function leaveblock()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
432 local bl = fs.bl
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
433 removevars()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
434 fs.bl = bl.prev
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
435 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
436
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
437 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
438 -- opening of a function
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
439 -- * top_fs is only for anchoring the top fs, so that parser() can
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
440 -- return it to the caller function along with useful output
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
441 -- * used in parser() and body()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
442 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
443
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
444 local function open_func()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
445 local new_fs -- per-function state
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
446 if not fs then -- top_fs is created early
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
447 new_fs = top_fs
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
448 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
449 new_fs = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
450 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
451 new_fs.prev = fs -- linked list of function states
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
452 new_fs.bl = nil
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
453 new_fs.locallist = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
454 fs = new_fs
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
455 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
456
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
457 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
458 -- closing of a function
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
459 -- * used in parser() and body()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
460 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
461
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
462 local function close_func()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
463 removevars()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
464 fs = fs.prev
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
465 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
466
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
467 --[[--------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
468 -- other parsing functions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
469 -- * for table constructor, parameter list, argument list
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
470 ----------------------------------------------------------------------]]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
471
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
472 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
473 -- parse a function name suffix, for function call specifications
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
474 -- * used in primaryexp(), funcname()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
475 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
476
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
477 local function field(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
478 -- field -> ['.' | ':'] NAME
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
479 local key = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
480 nextt() -- skip the dot or colon
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
481 checkname(key)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
482 v.k = "VINDEXED"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
483 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
484
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
485 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
486 -- parse a table indexing suffix, for constructors, expressions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
487 -- * used in recfield(), primaryexp()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
488 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
489
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
490 local function yindex(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
491 -- index -> '[' expr ']'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
492 nextt() -- skip the '['
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
493 expr(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
494 checknext("]")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
495 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
496
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
497 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
498 -- parse a table record (hash) field
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
499 -- * used in constructor()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
500 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
501
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
502 local function recfield(cc)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
503 -- recfield -> (NAME | '['exp1']') = exp1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
504 local key, val = {}, {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
505 if tok == "<name>" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
506 checkname(key)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
507 else-- tok == '['
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
508 yindex(key)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
509 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
510 checknext("=")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
511 expr(val)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
512 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
513
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
514 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
515 -- emit a set list instruction if enough elements (LFIELDS_PER_FLUSH)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
516 -- * note: retained in this skeleton because it modifies cc.v.k
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
517 -- * used in constructor()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
518 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
519
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
520 local function closelistfield(cc)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
521 if cc.v.k == "VVOID" then return end -- there is no list item
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
522 cc.v.k = "VVOID"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
523 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
524
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
525 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
526 -- parse a table list (array) field
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
527 -- * used in constructor()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
528 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
529
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
530 local function listfield(cc)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
531 expr(cc.v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
532 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
533
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
534 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
535 -- parse a table constructor
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
536 -- * used in funcargs(), simpleexp()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
537 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
538
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
539 local function constructor(t)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
540 -- constructor -> '{' [ field { fieldsep field } [ fieldsep ] ] '}'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
541 -- field -> recfield | listfield
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
542 -- fieldsep -> ',' | ';'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
543 local line = ln
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
544 local cc = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
545 cc.v = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
546 cc.t = t
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
547 t.k = "VRELOCABLE"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
548 cc.v.k = "VVOID"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
549 checknext("{")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
550 repeat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
551 if tok == "}" then break end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
552 -- closelistfield(cc) here
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
553 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
554 if c == "<name>" then -- may be listfields or recfields
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
555 if lookahead() ~= "=" then -- look ahead: expression?
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
556 listfield(cc)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
557 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
558 recfield(cc)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
559 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
560 elseif c == "[" then -- constructor_item -> recfield
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
561 recfield(cc)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
562 else -- constructor_part -> listfield
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
563 listfield(cc)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
564 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
565 until not testnext(",") and not testnext(";")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
566 check_match("}", "{", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
567 -- lastlistfield(cc) here
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
568 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
569
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
570 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
571 -- parse the arguments (parameters) of a function declaration
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
572 -- * used in body()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
573 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
574
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
575 local function parlist()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
576 -- parlist -> [ param { ',' param } ]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
577 local nparams = 0
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
578 if tok ~= ")" then -- is 'parlist' not empty?
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
579 repeat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
580 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
581 if c == "<name>" then -- param -> NAME
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
582 new_localvar(str_checkname())
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
583 nparams = nparams + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
584 elseif c == "..." then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
585 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
586 fs.is_vararg = true
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
587 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
588 syntaxerror("<name> or '...' expected")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
589 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
590 until fs.is_vararg or not testnext(",")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
591 end--if
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
592 adjustlocalvars(nparams)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
593 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
594
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
595 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
596 -- parse the parameters of a function call
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
597 -- * contrast with parlist(), used in function declarations
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
598 -- * used in primaryexp()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
599 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
600
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
601 local function funcargs(f)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
602 local args = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
603 local line = ln
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
604 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
605 if c == "(" then -- funcargs -> '(' [ explist1 ] ')'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
606 if line ~= lastln then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
607 syntaxerror("ambiguous syntax (function call x new statement)")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
608 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
609 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
610 if tok == ")" then -- arg list is empty?
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
611 args.k = "VVOID"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
612 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
613 explist1(args)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
614 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
615 check_match(")", "(", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
616 elseif c == "{" then -- funcargs -> constructor
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
617 constructor(args)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
618 elseif c == "<string>" then -- funcargs -> STRING
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
619 codestring(args, seminfo)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
620 nextt() -- must use 'seminfo' before 'next'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
621 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
622 syntaxerror("function arguments expected")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
623 return
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
624 end--if c
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
625 f.k = "VCALL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
626 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
627
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
628 --[[--------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
629 -- mostly expression functions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
630 ----------------------------------------------------------------------]]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
631
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
632 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
633 -- parses an expression in parentheses or a single variable
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
634 -- * used in primaryexp()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
635 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
636
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
637 local function prefixexp(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
638 -- prefixexp -> NAME | '(' expr ')'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
639 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
640 if c == "(" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
641 local line = ln
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
642 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
643 expr(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
644 check_match(")", "(", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
645 elseif c == "<name>" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
646 singlevar(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
647 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
648 syntaxerror("unexpected symbol")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
649 end--if c
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
650 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
651
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
652 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
653 -- parses a prefixexp (an expression in parentheses or a single
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
654 -- variable) or a function call specification
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
655 -- * used in simpleexp(), assignment(), expr_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
656 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
657
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
658 local function primaryexp(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
659 -- primaryexp ->
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
660 -- prefixexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs }
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
661 prefixexp(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
662 while true do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
663 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
664 if c == "." then -- field
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
665 field(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
666 elseif c == "[" then -- '[' exp1 ']'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
667 local key = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
668 yindex(key)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
669 elseif c == ":" then -- ':' NAME funcargs
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
670 local key = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
671 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
672 checkname(key)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
673 funcargs(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
674 elseif c == "(" or c == "<string>" or c == "{" then -- funcargs
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
675 funcargs(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
676 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
677 return
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
678 end--if c
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
679 end--while
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
680 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
681
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
682 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
683 -- parses general expression types, constants handled here
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
684 -- * used in subexpr()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
685 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
686
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
687 local function simpleexp(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
688 -- simpleexp -> NUMBER | STRING | NIL | TRUE | FALSE | ... |
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
689 -- constructor | FUNCTION body | primaryexp
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
690 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
691 if c == "<number>" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
692 v.k = "VKNUM"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
693 elseif c == "<string>" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
694 codestring(v, seminfo)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
695 elseif c == "nil" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
696 v.k = "VNIL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
697 elseif c == "true" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
698 v.k = "VTRUE"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
699 elseif c == "false" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
700 v.k = "VFALSE"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
701 elseif c == "..." then -- vararg
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
702 check_condition(fs.is_vararg == true,
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
703 "cannot use '...' outside a vararg function");
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
704 v.k = "VVARARG"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
705 elseif c == "{" then -- constructor
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
706 constructor(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
707 return
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
708 elseif c == "function" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
709 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
710 body(v, false, ln)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
711 return
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
712 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
713 primaryexp(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
714 return
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
715 end--if c
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
716 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
717 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
718
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
719 ------------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
720 -- Parse subexpressions. Includes handling of unary operators and binary
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
721 -- operators. A subexpr is given the rhs priority level of the operator
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
722 -- immediately left of it, if any (limit is -1 if none,) and if a binop
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
723 -- is found, limit is compared with the lhs priority level of the binop
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
724 -- in order to determine which executes first.
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
725 -- * recursively called
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
726 -- * used in expr()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
727 ------------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
728
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
729 local function subexpr(v, limit)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
730 -- subexpr -> (simpleexp | unop subexpr) { binop subexpr }
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
731 -- * where 'binop' is any binary operator with a priority
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
732 -- higher than 'limit'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
733 local op = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
734 local uop = unopr[op]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
735 if uop then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
736 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
737 subexpr(v, UNARY_PRIORITY)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
738 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
739 simpleexp(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
740 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
741 -- expand while operators have priorities higher than 'limit'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
742 op = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
743 local binop = binopr_left[op]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
744 while binop and binop > limit do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
745 local v2 = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
746 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
747 -- read sub-expression with higher priority
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
748 local nextop = subexpr(v2, binopr_right[op])
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
749 op = nextop
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
750 binop = binopr_left[op]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
751 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
752 return op -- return first untreated operator
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
753 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
754
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
755 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
756 -- Expression parsing starts here. Function subexpr is entered with the
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
757 -- left operator (which is non-existent) priority of -1, which is lower
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
758 -- than all actual operators. Expr information is returned in parm v.
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
759 -- * used in cond(), explist1(), index(), recfield(), listfield(),
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
760 -- prefixexp(), while_stat(), exp1()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
761 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
762
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
763 -- this is a forward-referenced local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
764 function expr(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
765 -- expr -> subexpr
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
766 subexpr(v, 0)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
767 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
768
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
769 --[[--------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
770 -- third level parsing functions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
771 ----------------------------------------------------------------------]]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
772
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
773 ------------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
774 -- parse a variable assignment sequence
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
775 -- * recursively called
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
776 -- * used in expr_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
777 ------------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
778
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
779 local function assignment(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
780 local e = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
781 local c = v.v.k
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
782 check_condition(c == "VLOCAL" or c == "VUPVAL" or c == "VGLOBAL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
783 or c == "VINDEXED", "syntax error")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
784 if testnext(",") then -- assignment -> ',' primaryexp assignment
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
785 local nv = {} -- expdesc
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
786 nv.v = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
787 primaryexp(nv.v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
788 -- lparser.c deals with some register usage conflict here
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
789 assignment(nv)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
790 else -- assignment -> '=' explist1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
791 checknext("=")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
792 explist1(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
793 return -- avoid default
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
794 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
795 e.k = "VNONRELOC"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
796 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
797
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
798 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
799 -- parse a for loop body for both versions of the for loop
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
800 -- * used in fornum(), forlist()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
801 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
802
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
803 local function forbody(nvars, isnum)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
804 -- forbody -> DO block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
805 checknext("do")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
806 enterblock(false) -- scope for declared variables
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
807 adjustlocalvars(nvars)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
808 block()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
809 leaveblock() -- end of scope for declared variables
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
810 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
811
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
812 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
813 -- parse a numerical for loop, calls forbody()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
814 -- * used in for_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
815 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
816
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
817 local function fornum(varname)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
818 -- fornum -> NAME = exp1, exp1 [, exp1] DO body
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
819 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
820 new_localvarliteral("(for index)")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
821 new_localvarliteral("(for limit)")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
822 new_localvarliteral("(for step)")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
823 new_localvar(varname)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
824 checknext("=")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
825 exp1() -- initial value
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
826 checknext(",")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
827 exp1() -- limit
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
828 if testnext(",") then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
829 exp1() -- optional step
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
830 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
831 -- default step = 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
832 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
833 forbody(1, true)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
834 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
835
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
836 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
837 -- parse a generic for loop, calls forbody()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
838 -- * used in for_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
839 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
840
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
841 local function forlist(indexname)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
842 -- forlist -> NAME {, NAME} IN explist1 DO body
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
843 local e = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
844 -- create control variables
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
845 new_localvarliteral("(for generator)")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
846 new_localvarliteral("(for state)")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
847 new_localvarliteral("(for control)")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
848 -- create declared variables
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
849 new_localvar(indexname)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
850 local nvars = 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
851 while testnext(",") do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
852 new_localvar(str_checkname())
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
853 nvars = nvars + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
854 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
855 checknext("in")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
856 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
857 explist1(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
858 forbody(nvars, false)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
859 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
860
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
861 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
862 -- parse a function name specification
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
863 -- * used in func_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
864 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
865
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
866 local function funcname(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
867 -- funcname -> NAME {field} [':' NAME]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
868 local needself = false
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
869 singlevar(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
870 while tok == "." do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
871 field(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
872 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
873 if tok == ":" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
874 needself = true
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
875 field(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
876 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
877 return needself
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
878 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
879
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
880 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
881 -- parse the single expressions needed in numerical for loops
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
882 -- * used in fornum()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
883 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
884
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
885 -- this is a forward-referenced local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
886 function exp1()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
887 -- exp1 -> expr
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
888 local e = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
889 expr(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
890 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
891
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
892 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
893 -- parse condition in a repeat statement or an if control structure
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
894 -- * used in repeat_stat(), test_then_block()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
895 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
896
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
897 local function cond()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
898 -- cond -> expr
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
899 local v = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
900 expr(v) -- read condition
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
901 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
902
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
903 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
904 -- parse part of an if control structure, including the condition
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
905 -- * used in if_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
906 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
907
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
908 local function test_then_block()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
909 -- test_then_block -> [IF | ELSEIF] cond THEN block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
910 nextt() -- skip IF or ELSEIF
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
911 cond()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
912 checknext("then")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
913 block() -- 'then' part
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
914 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
915
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
916 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
917 -- parse a local function statement
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
918 -- * used in local_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
919 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
920
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
921 local function localfunc()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
922 -- localfunc -> NAME body
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
923 local v, b = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
924 new_localvar(str_checkname())
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
925 v.k = "VLOCAL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
926 adjustlocalvars(1)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
927 body(b, false, ln)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
928 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
929
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
930 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
931 -- parse a local variable declaration statement
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
932 -- * used in local_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
933 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
934
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
935 local function localstat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
936 -- localstat -> NAME {',' NAME} ['=' explist1]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
937 local nvars = 0
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
938 local e = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
939 repeat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
940 new_localvar(str_checkname())
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
941 nvars = nvars + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
942 until not testnext(",")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
943 if testnext("=") then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
944 explist1(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
945 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
946 e.k = "VVOID"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
947 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
948 adjustlocalvars(nvars)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
949 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
950
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
951 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
952 -- parse a list of comma-separated expressions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
953 -- * used in return_stat(), localstat(), funcargs(), assignment(),
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
954 -- forlist()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
955 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
956
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
957 -- this is a forward-referenced local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
958 function explist1(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
959 -- explist1 -> expr { ',' expr }
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
960 expr(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
961 while testnext(",") do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
962 expr(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
963 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
964 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
965
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
966 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
967 -- parse function declaration body
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
968 -- * used in simpleexp(), localfunc(), func_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
969 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
970
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
971 -- this is a forward-referenced local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
972 function body(e, needself, line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
973 -- body -> '(' parlist ')' chunk END
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
974 open_func()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
975 checknext("(")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
976 if needself then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
977 new_localvarliteral("self", true)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
978 adjustlocalvars(1)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
979 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
980 parlist()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
981 checknext(")")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
982 chunk()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
983 check_match("end", "function", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
984 close_func()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
985 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
986
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
987 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
988 -- parse a code block or unit
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
989 -- * used in do_stat(), while_stat(), forbody(), test_then_block(),
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
990 -- if_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
991 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
992
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
993 -- this is a forward-referenced local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
994 function block()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
995 -- block -> chunk
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
996 enterblock(false)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
997 chunk()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
998 leaveblock()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
999 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1000
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1001 --[[--------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1002 -- second level parsing functions, all with '_stat' suffix
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1003 -- * since they are called via a table lookup, they cannot be local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1004 -- functions (a lookup table of local functions might be smaller...)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1005 -- * stat() -> *_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1006 ----------------------------------------------------------------------]]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1007
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1008 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1009 -- initial parsing for a for loop, calls fornum() or forlist()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1010 -- * removed 'line' parameter (used to set debug information only)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1011 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1012 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1013
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1014 function for_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1015 -- stat -> for_stat -> FOR (fornum | forlist) END
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1016 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1017 enterblock(true) -- scope for loop and control variables
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1018 nextt() -- skip 'for'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1019 local varname = str_checkname() -- first variable name
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1020 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1021 if c == "=" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1022 fornum(varname)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1023 elseif c == "," or c == "in" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1024 forlist(varname)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1025 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1026 syntaxerror("'=' or 'in' expected")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1027 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1028 check_match("end", "for", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1029 leaveblock() -- loop scope (`break' jumps to this point)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1030 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1031
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1032 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1033 -- parse a while-do control structure, body processed by block()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1034 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1035 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1036
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1037 function while_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1038 -- stat -> while_stat -> WHILE cond DO block END
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1039 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1040 nextt() -- skip WHILE
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1041 cond() -- parse condition
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1042 enterblock(true)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1043 checknext("do")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1044 block()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1045 check_match("end", "while", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1046 leaveblock()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1047 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1048
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1049 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1050 -- parse a repeat-until control structure, body parsed by chunk()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1051 -- * originally, repeatstat() calls breakstat() too if there is an
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1052 -- upvalue in the scope block; nothing is actually lexed, it is
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1053 -- actually the common code in breakstat() for closing of upvalues
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1054 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1055 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1056
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1057 function repeat_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1058 -- stat -> repeat_stat -> REPEAT block UNTIL cond
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1059 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1060 enterblock(true) -- loop block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1061 enterblock(false) -- scope block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1062 nextt() -- skip REPEAT
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1063 chunk()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1064 check_match("until", "repeat", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1065 cond()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1066 -- close upvalues at scope level below
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1067 leaveblock() -- finish scope
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1068 leaveblock() -- finish loop
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1069 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1070
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1071 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1072 -- parse an if control structure
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1073 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1074 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1075
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1076 function if_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1077 -- stat -> if_stat -> IF cond THEN block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1078 -- {ELSEIF cond THEN block} [ELSE block] END
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1079 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1080 local v = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1081 test_then_block() -- IF cond THEN block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1082 while tok == "elseif" do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1083 test_then_block() -- ELSEIF cond THEN block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1084 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1085 if tok == "else" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1086 nextt() -- skip ELSE
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1087 block() -- 'else' part
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1088 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1089 check_match("end", "if", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1090 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1091
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1092 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1093 -- parse a return statement
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1094 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1095 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1096
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1097 function return_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1098 -- stat -> return_stat -> RETURN explist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1099 local e = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1100 nextt() -- skip RETURN
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1101 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1102 if block_follow[c] or c == ";" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1103 -- return no values
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1104 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1105 explist1(e) -- optional return values
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1106 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1107 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1108
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1109 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1110 -- parse a break statement
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1111 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1112 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1113
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1114 function break_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1115 -- stat -> break_stat -> BREAK
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1116 local bl = fs.bl
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1117 nextt() -- skip BREAK
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1118 while bl and not bl.isbreakable do -- find a breakable block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1119 bl = bl.prev
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1120 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1121 if not bl then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1122 syntaxerror("no loop to break")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1123 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1124 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1125
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1126 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1127 -- parse a function call with no returns or an assignment statement
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1128 -- * the struct with .prev is used for name searching in lparse.c,
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1129 -- so it is retained for now; present in assignment() also
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1130 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1131 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1132
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1133 function expr_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1134 -- stat -> expr_stat -> func | assignment
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1135 local v = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1136 v.v = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1137 primaryexp(v.v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1138 if v.v.k == "VCALL" then -- stat -> func
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1139 -- call statement uses no results
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1140 else -- stat -> assignment
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1141 v.prev = nil
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1142 assignment(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1143 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1144 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1145
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1146 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1147 -- parse a function statement
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1148 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1149 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1150
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1151 function function_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1152 -- stat -> function_stat -> FUNCTION funcname body
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1153 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1154 local v, b = {}, {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1155 nextt() -- skip FUNCTION
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1156 local needself = funcname(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1157 body(b, needself, line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1158 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1159
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1160 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1161 -- parse a simple block enclosed by a DO..END pair
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1162 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1163 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1164
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1165 function do_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1166 -- stat -> do_stat -> DO block END
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1167 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1168 nextt() -- skip DO
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1169 block()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1170 check_match("end", "do", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1171 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1172
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1173 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1174 -- parse a statement starting with LOCAL
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1175 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1176 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1177
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1178 function local_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1179 -- stat -> local_stat -> LOCAL FUNCTION localfunc
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1180 -- -> LOCAL localstat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1181 nextt() -- skip LOCAL
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1182 if testnext("function") then -- local function?
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1183 localfunc()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1184 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1185 localstat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1186 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1187 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1188
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1189 --[[--------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1190 -- main functions, top level parsing functions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1191 -- * accessible functions are: init(lexer), parser()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1192 -- * [entry] -> parser() -> chunk() -> stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1193 ----------------------------------------------------------------------]]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1194
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1195 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1196 -- initial parsing for statements, calls '_stat' suffixed functions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1197 -- * used in chunk()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1198 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1199
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1200 local function stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1201 -- stat -> if_stat while_stat do_stat for_stat repeat_stat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1202 -- function_stat local_stat return_stat break_stat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1203 -- expr_stat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1204 line = ln -- may be needed for error messages
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1205 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1206 local fn = stat_call[c]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1207 -- handles: if while do for repeat function local return break
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1208 if fn then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1209 _G[fn]()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1210 -- return or break must be last statement
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1211 if c == "return" or c == "break" then return true end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1212 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1213 expr_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1214 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1215 return false
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1216 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1217
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1218 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1219 -- parse a chunk, which consists of a bunch of statements
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1220 -- * used in parser(), body(), block(), repeat_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1221 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1222
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1223 -- this is a forward-referenced local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1224 function chunk()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1225 -- chunk -> { stat [';'] }
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1226 local islast = false
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1227 while not islast and not block_follow[tok] do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1228 islast = stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1229 testnext(";")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1230 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1231 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1232
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1233 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1234 -- performs parsing, returns parsed data structure
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1235 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1236
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1237 function parser()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1238 open_func()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1239 fs.is_vararg = true -- main func. is always vararg
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1240 nextt() -- read first token
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1241 chunk()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1242 check("<eof>")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1243 close_func()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1244 return globalinfo, localinfo
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1245 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1246
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1247 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1248 -- initialization function
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1249 ----------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1250
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1251 function init(tokorig, seminfoorig, toklnorig)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1252 tpos = 1 -- token position
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1253 top_fs = {} -- reset top level function state
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1254 ------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1255 -- set up grammar-only token tables; impedance-matching...
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1256 -- note that constants returned by the lexer is source-level, so
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1257 -- for now, fake(!) constant tokens (TK_NUMBER|TK_STRING|TK_LSTRING)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1258 ------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1259 local j = 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1260 toklist, seminfolist, toklnlist, xreflist = {}, {}, {}, {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1261 for i = 1, #tokorig do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1262 local tok = tokorig[i]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1263 local yep = true
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1264 if tok == "TK_KEYWORD" or tok == "TK_OP" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1265 tok = seminfoorig[i]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1266 elseif tok == "TK_NAME" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1267 tok = "<name>"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1268 seminfolist[j] = seminfoorig[i]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1269 elseif tok == "TK_NUMBER" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1270 tok = "<number>"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1271 seminfolist[j] = 0 -- fake!
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1272 elseif tok == "TK_STRING" or tok == "TK_LSTRING" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1273 tok = "<string>"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1274 seminfolist[j] = "" -- fake!
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1275 elseif tok == "TK_EOS" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1276 tok = "<eof>"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1277 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1278 -- non-grammar tokens; ignore them
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1279 yep = false
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1280 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1281 if yep then -- set rest of the information
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1282 toklist[j] = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1283 toklnlist[j] = toklnorig[i]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1284 xreflist[j] = i
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1285 j = j + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1286 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1287 end--for
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1288 ------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1289 -- initialize data structures for variable tracking
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1290 ------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1291 globalinfo, globallookup, localinfo = {}, {}, {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1292 ilocalinfo, ilocalrefs = {}, {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1293 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1294
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1295 return _G

mercurial