minify/lparser.lua

Fri, 05 May 2017 09:44:43 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Fri, 05 May 2017 09:44:43 +0100
branch
lua5.2
changeset 94
cf209451be5f
parent 85
347ac1733354
child 99
2b6416334a25
permissions
-rw-r--r--

minify: Preserve _ENV, as it's lexically significant in 5.2+

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
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 -- variable and data structure initialization
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 ----------------------------------------------------------------------]]
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 -- initialization: main variables
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 ----------------------------------------------------------------------
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 local toklist, -- grammar-only token tables (token table,
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 seminfolist, -- semantic information table, line number
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 toklnlist, -- table, cross-reference table)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 xreflist,
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 tpos, -- token position
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 line, -- start line # for error messages
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 lastln, -- last line # for ambiguous syntax chk
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 tok, seminfo, ln, xref, -- token, semantic info, line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 nameref, -- proper position of <name> token
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 fs, -- current function state
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 top_fs, -- top-level function state
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 globalinfo, -- global variable information table
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 globallookup, -- global variable name lookup table
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 localinfo, -- local variable information table
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 ilocalinfo, -- inactive locals (prior to activation)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 ilocalrefs -- corresponding references to activate
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 -- forward references for local functions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 local explist1, expr, block, exp1, body, chunk
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61
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 -- initialization: data structures
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 ----------------------------------------------------------------------
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 local gmatch = string.gmatch
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 local block_follow = {} -- lookahead check in chunk(), returnstat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 for v in gmatch("else elseif end until <eof>", "%S+") do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 block_follow[v] = true
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 local stat_call = {} -- lookup for calls in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 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
75 stat_call[v] = v.."_stat"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 local binopr_left = {} -- binary operators, left priority
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 local binopr_right = {} -- binary operators, right priority
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 for op, lt, rt in gmatch([[
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 {+ 6 6}{- 6 6}{* 7 7}{/ 7 7}{% 7 7}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 {^ 10 9}{.. 5 4}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 {~= 3 3}{== 3 3}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 {< 3 3}{<= 3 3}{> 3 3}{>= 3 3}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 {and 2 2}{or 1 1}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 ]], "{(%S+)%s(%d+)%s(%d+)}") do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 binopr_left[op] = lt + 0
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 binopr_right[op] = rt + 0
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 local unopr = { ["not"] = true, ["-"] = true,
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 ["#"] = true, } -- unary operators
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 local UNARY_PRIORITY = 8 -- priority for unary operators
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94
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 -- support functions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 ----------------------------------------------------------------------]]
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 -- formats error message and throws error (duplicated from llex)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 -- * a simplified version, does not report what token was responsible
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 ----------------------------------------------------------------------
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 local function errorline(s, line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 local e = error or base.error
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 e(string.format("(source):%d: %s", line or ln, s))
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108
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 -- handles incoming token, semantic information pairs
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 -- * NOTE: 'nextt' is named 'next' originally
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 ----------------------------------------------------------------------
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 -- reads in next token
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 local function nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 lastln = toklnlist[tpos]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 tok, seminfo, ln, xref
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 = toklist[tpos], seminfolist[tpos], toklnlist[tpos], xreflist[tpos]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 tpos = tpos + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 -- peek at next token (single lookahead for table constructor)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 local function lookahead()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 return toklist[tpos]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126
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 -- throws a syntax error, or if token expected is not there
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 ----------------------------------------------------------------------
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 local function syntaxerror(msg)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 local tok = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 if tok ~= "<number>" and tok ~= "<string>" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 if tok == "<name>" then tok = seminfo end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135 tok = "'"..tok.."'"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 errorline(msg.." near "..tok)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140 local function error_expected(token)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
141 syntaxerror("'"..token.."' expected")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
143
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 -- tests for a token, returns outcome
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 -- * return value changed to boolean
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 ----------------------------------------------------------------------
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 local function testnext(c)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 if tok == c then nextt(); return true end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152
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 -- check for existence of a token, throws error if not found
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
155 ----------------------------------------------------------------------
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 local function check(c)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 if tok ~= c then error_expected(c) end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160
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 -- verify existence of a token, then skip it
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
163 ----------------------------------------------------------------------
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 local function checknext(c)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 check(c); nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168
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 -- throws error if condition not matched
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171 ----------------------------------------------------------------------
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 local function check_condition(c, msg)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174 if not c then syntaxerror(msg) end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176
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 -- verifies token conditions are met or else throw error
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179 ----------------------------------------------------------------------
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 local function check_match(what, who, where)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
182 if not testnext(what) then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183 if where == ln then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184 error_expected(what)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
186 syntaxerror("'"..what.."' expected (to close '"..who.."' at line "..where..")")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
187 end
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
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 -- expect that token is a name, return the name
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
193 ----------------------------------------------------------------------
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 local function str_checkname()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 check("<name>")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197 local ts = seminfo
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
198 nameref = xref
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
199 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
200 return ts
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
201 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
202
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 -- adds given string s in string pool, sets e as VK
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
205 ----------------------------------------------------------------------
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 local function codestring(e, s)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
208 e.k = "VK"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
210
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 -- consume a name token, adds it to string pool
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
213 ----------------------------------------------------------------------
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 local function checkname(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
216 codestring(e, str_checkname())
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
217 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
218
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 -- variable (global|local|upvalue) handling
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
221 -- * to track locals and globals, we can extend Yueliang's minimal
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
222 -- variable management code with little trouble
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
223 -- * entry point is singlevar() for variable lookups
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
224 -- * lookup tables (bl.locallist) are maintained awkwardly in the basic
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
225 -- block data structures, PLUS the function data structure (this is
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
226 -- 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
227 ----------------------------------------------------------------------]]
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 -- register a local variable, create local variable object, set in
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
231 -- to-activate variable list
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
232 -- * used in new_localvarliteral(), parlist(), fornum(), forlist(),
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
233 -- localfunc(), localstat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
234 ----------------------------------------------------------------------
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 local function new_localvar(name, special)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
237 local bl = fs.bl
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
238 local locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
239 -- locate locallist in current block object or function root object
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
240 if bl then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
241 locallist = bl.locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
242 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
243 locallist = fs.locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
244 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
245 -- build local variable information object and set localinfo
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
246 local id = #localinfo + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
247 localinfo[id] = { -- new local variable object
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
248 name = name, -- local variable name
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
249 xref = { nameref }, -- xref, first value is declaration
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
250 decl = nameref, -- location of declaration, = xref[1]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
251 }
94
cf209451be5f minify: Preserve _ENV, as it's lexically significant in 5.2+
Matthew Wild <mwild1@gmail.com>
parents: 85
diff changeset
252 if special or name == "_ENV" then -- "self" must be not be changed
cf209451be5f minify: Preserve _ENV, as it's lexically significant in 5.2+
Matthew Wild <mwild1@gmail.com>
parents: 85
diff changeset
253 localinfo[id].preserve = true
1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
254 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255 -- 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
256 -- but first, keep it inactive until it gets activated
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
257 local i = #ilocalinfo + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
258 ilocalinfo[i] = id
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259 ilocalrefs[i] = locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
260 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
261
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 -- actually activate the variables so that they are visible
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
264 -- * remember Lua semantics, e.g. RHS is evaluated first, then LHS
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
265 -- * used in parlist(), forbody(), localfunc(), localstat(), body()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
266 ----------------------------------------------------------------------
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 local function adjustlocalvars(nvars)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
269 local sz = #ilocalinfo
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
270 -- i goes from left to right, in order of local allocation, because
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
271 -- 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
272 while nvars > 0 do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
273 nvars = nvars - 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
274 local i = sz - nvars
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
275 local id = ilocalinfo[i] -- local's id
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
276 local obj = localinfo[id]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
277 local name = obj.name -- name of local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
278 obj.act = xref -- set activation location
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
279 ilocalinfo[i] = nil
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
280 local locallist = ilocalrefs[i] -- ref to lookup table to update
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
281 ilocalrefs[i] = nil
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
282 local existing = locallist[name] -- if existing, remove old first!
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
283 if existing then -- do not overlap, set special
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
284 obj = localinfo[existing] -- form of rem, as -id
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
285 obj.rem = -id
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
286 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
287 locallist[name] = id -- activate, now visible to Lua
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
288 end
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
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 -- remove (deactivate) variables in current scope (before scope exits)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
293 -- * zap entire locallist tables since we are not allocating registers
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
294 -- * used in leaveblock(), close_func()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
295 ----------------------------------------------------------------------
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 local function removevars()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
298 local bl = fs.bl
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
299 local locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
300 -- locate locallist in current block object or function root object
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
301 if bl then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
302 locallist = bl.locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
303 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
304 locallist = fs.locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
305 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
306 -- enumerate the local list at current scope and deactivate 'em
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
307 for name, id in base.pairs(locallist) do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
308 local obj = localinfo[id]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
309 obj.rem = xref -- set deactivation location
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
310 end
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
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 -- creates a new local variable given a name
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
315 -- * skips internal locals (those starting with '('), so internal
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
316 -- locals never needs a corresponding adjustlocalvars() call
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
317 -- * special is true for "self" which must not be optimized
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
318 -- * used in fornum(), forlist(), parlist(), body()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
319 ----------------------------------------------------------------------
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 local function new_localvarliteral(name, special)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
322 if string.sub(name, 1, 1) == "(" then -- can skip internal locals
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
323 return
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
324 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
325 new_localvar(name, special)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
326 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
327
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 -- search the local variable namespace of the given fs for a match
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
330 -- * returns localinfo index
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
331 -- * used only in singlevaraux()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
332 ----------------------------------------------------------------------
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 local function searchvar(fs, n)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
335 local bl = fs.bl
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
336 local locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
337 if bl then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
338 locallist = bl.locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
339 while locallist do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
340 if locallist[n] then return locallist[n] end -- found
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
341 bl = bl.prev
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
342 locallist = bl and bl.locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
343 end
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 locallist = fs.locallist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
346 return locallist[n] or -1 -- found or not found (-1)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
347 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
348
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 -- handle locals, globals and upvalues and related processing
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
351 -- * search mechanism is recursive, calls itself to search parents
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
352 -- * used only in singlevar()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
353 ----------------------------------------------------------------------
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 local function singlevaraux(fs, n, var)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
356 if fs == nil then -- no more levels?
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
357 var.k = "VGLOBAL" -- default is global variable
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
358 return "VGLOBAL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
359 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
360 local v = searchvar(fs, n) -- look up at current level
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
361 if v >= 0 then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
362 var.k = "VLOCAL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
363 var.id = v
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
364 -- codegen may need to deal with upvalue here
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
365 return "VLOCAL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
366 else -- not found at current level; try upper one
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
367 if singlevaraux(fs.prev, n, var) == "VGLOBAL" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
368 return "VGLOBAL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
369 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
370 -- else was LOCAL or UPVAL, handle here
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
371 var.k = "VUPVAL" -- upvalue in this level
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
372 return "VUPVAL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
373 end--if v
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
374 end--if fs
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
375 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
376
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 -- consume a name token, creates a variable (global|local|upvalue)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
379 -- * used in prefixexp(), funcname()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
380 ----------------------------------------------------------------------
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 local function singlevar(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
383 local name = str_checkname()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
384 singlevaraux(fs, name, v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
385 ------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
386 -- variable tracking
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
387 ------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
388 if v.k == "VGLOBAL" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
389 -- if global being accessed, keep track of it by creating an object
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
390 local id = globallookup[name]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
391 if not id then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
392 id = #globalinfo + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
393 globalinfo[id] = { -- new global variable object
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
394 name = name, -- global variable name
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
395 xref = { nameref }, -- xref, first value is declaration
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
396 }
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
397 globallookup[name] = id -- remember it
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
398 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
399 local obj = globalinfo[id].xref
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
400 obj[#obj + 1] = nameref -- add xref
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
401 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
402 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
403 -- local/upvalue is being accessed, keep track of it
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
404 local id = v.id
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
405 local obj = localinfo[id].xref
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
406 obj[#obj + 1] = nameref -- add xref
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
407 end
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
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 -- state management functions with open/close pairs
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
412 ----------------------------------------------------------------------]]
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 -- enters a code unit, initializes elements
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
416 ----------------------------------------------------------------------
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 local function enterblock(isbreakable)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
419 local bl = {} -- per-block state
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
420 bl.isbreakable = isbreakable
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
421 bl.prev = fs.bl
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
422 bl.locallist = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
423 fs.bl = bl
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
424 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
425
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 -- leaves a code unit, close any upvalues
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
428 ----------------------------------------------------------------------
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 local function leaveblock()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
431 local bl = fs.bl
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
432 removevars()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
433 fs.bl = bl.prev
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
434 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
435
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 -- opening of a function
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
438 -- * 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
439 -- return it to the caller function along with useful output
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
440 -- * used in parser() and body()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
441 ----------------------------------------------------------------------
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 local function open_func()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
444 local new_fs -- per-function state
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
445 if not fs then -- top_fs is created early
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
446 new_fs = top_fs
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
447 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
448 new_fs = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
449 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
450 new_fs.prev = fs -- linked list of function states
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
451 new_fs.bl = nil
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
452 new_fs.locallist = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
453 fs = new_fs
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
454 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
455
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 -- closing of a function
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
458 -- * used in parser() and body()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
459 ----------------------------------------------------------------------
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 local function close_func()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
462 removevars()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
463 fs = fs.prev
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
464 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
465
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 -- other parsing functions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
468 -- * for table constructor, parameter list, argument list
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
469 ----------------------------------------------------------------------]]
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 -- parse a function name suffix, for function call specifications
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
473 -- * used in primaryexp(), funcname()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
474 ----------------------------------------------------------------------
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 local function field(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
477 -- field -> ['.' | ':'] NAME
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
478 local key = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
479 nextt() -- skip the dot or colon
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
480 checkname(key)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
481 v.k = "VINDEXED"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
482 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
483
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 -- parse a table indexing suffix, for constructors, expressions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
486 -- * used in recfield(), primaryexp()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
487 ----------------------------------------------------------------------
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 local function yindex(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
490 -- index -> '[' expr ']'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
491 nextt() -- skip the '['
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
492 expr(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
493 checknext("]")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
494 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
495
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 -- parse a table record (hash) field
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
498 -- * used in constructor()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
499 ----------------------------------------------------------------------
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 local function recfield(cc)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
502 -- recfield -> (NAME | '['exp1']') = exp1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
503 local key, val = {}, {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
504 if tok == "<name>" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
505 checkname(key)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
506 else-- tok == '['
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
507 yindex(key)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
508 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
509 checknext("=")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
510 expr(val)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
511 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
512
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 -- emit a set list instruction if enough elements (LFIELDS_PER_FLUSH)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
515 -- * note: retained in this skeleton because it modifies cc.v.k
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
516 -- * used in constructor()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
517 ----------------------------------------------------------------------
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 local function closelistfield(cc)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
520 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
521 cc.v.k = "VVOID"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
522 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
523
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 -- parse a table list (array) field
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
526 -- * used in constructor()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
527 ----------------------------------------------------------------------
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 local function listfield(cc)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
530 expr(cc.v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
531 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
532
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 -- parse a table constructor
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
535 -- * used in funcargs(), simpleexp()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
536 ----------------------------------------------------------------------
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 local function constructor(t)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
539 -- constructor -> '{' [ field { fieldsep field } [ fieldsep ] ] '}'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
540 -- field -> recfield | listfield
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
541 -- fieldsep -> ',' | ';'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
542 local line = ln
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
543 local cc = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
544 cc.v = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
545 cc.t = t
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
546 t.k = "VRELOCABLE"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
547 cc.v.k = "VVOID"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
548 checknext("{")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
549 repeat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
550 if tok == "}" then break end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
551 -- closelistfield(cc) here
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
552 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
553 if c == "<name>" then -- may be listfields or recfields
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
554 if lookahead() ~= "=" then -- look ahead: expression?
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
555 listfield(cc)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
556 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
557 recfield(cc)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
558 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
559 elseif c == "[" then -- constructor_item -> recfield
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
560 recfield(cc)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
561 else -- constructor_part -> listfield
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
562 listfield(cc)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
563 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
564 until not testnext(",") and not testnext(";")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
565 check_match("}", "{", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
566 -- lastlistfield(cc) here
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
567 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
568
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 -- parse the arguments (parameters) of a function declaration
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
571 -- * used in body()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
572 ----------------------------------------------------------------------
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 local function parlist()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
575 -- parlist -> [ param { ',' param } ]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
576 local nparams = 0
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
577 if tok ~= ")" then -- is 'parlist' not empty?
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
578 repeat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
579 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
580 if c == "<name>" then -- param -> NAME
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
581 new_localvar(str_checkname())
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
582 nparams = nparams + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
583 elseif c == "..." then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
584 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
585 fs.is_vararg = true
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
586 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
587 syntaxerror("<name> or '...' expected")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
588 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
589 until fs.is_vararg or not testnext(",")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
590 end--if
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
591 adjustlocalvars(nparams)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
592 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
593
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 -- parse the parameters of a function call
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
596 -- * contrast with parlist(), used in function declarations
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
597 -- * used in primaryexp()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
598 ----------------------------------------------------------------------
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 local function funcargs(f)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
601 local args = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
602 local line = ln
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
603 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
604 if c == "(" then -- funcargs -> '(' [ explist1 ] ')'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
605 if line ~= lastln then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
606 syntaxerror("ambiguous syntax (function call x new statement)")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
607 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
608 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
609 if tok == ")" then -- arg list is empty?
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
610 args.k = "VVOID"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
611 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
612 explist1(args)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
613 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
614 check_match(")", "(", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
615 elseif c == "{" then -- funcargs -> constructor
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
616 constructor(args)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
617 elseif c == "<string>" then -- funcargs -> STRING
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
618 codestring(args, seminfo)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
619 nextt() -- must use 'seminfo' before 'next'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
620 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
621 syntaxerror("function arguments expected")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
622 return
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
623 end--if c
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
624 f.k = "VCALL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
625 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
626
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 -- mostly expression functions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
629 ----------------------------------------------------------------------]]
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 -- parses an expression in parentheses or a single variable
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
633 -- * used in primaryexp()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
634 ----------------------------------------------------------------------
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 local function prefixexp(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
637 -- prefixexp -> NAME | '(' expr ')'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
638 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
639 if c == "(" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
640 local line = ln
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
641 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
642 expr(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
643 check_match(")", "(", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
644 elseif c == "<name>" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
645 singlevar(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
646 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
647 syntaxerror("unexpected symbol")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
648 end--if c
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
649 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
650
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 -- parses a prefixexp (an expression in parentheses or a single
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
653 -- variable) or a function call specification
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
654 -- * used in simpleexp(), assignment(), expr_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
655 ----------------------------------------------------------------------
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 local function primaryexp(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
658 -- primaryexp ->
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
659 -- prefixexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs }
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
660 prefixexp(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
661 while true do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
662 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
663 if c == "." then -- field
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
664 field(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
665 elseif c == "[" then -- '[' exp1 ']'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
666 local key = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
667 yindex(key)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
668 elseif c == ":" then -- ':' NAME funcargs
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
669 local key = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
670 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
671 checkname(key)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
672 funcargs(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
673 elseif c == "(" or c == "<string>" or c == "{" then -- funcargs
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
674 funcargs(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
675 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
676 return
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
677 end--if c
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
678 end--while
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
679 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
680
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 -- parses general expression types, constants handled here
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
683 -- * used in subexpr()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
684 ----------------------------------------------------------------------
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 local function simpleexp(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
687 -- simpleexp -> NUMBER | STRING | NIL | TRUE | FALSE | ... |
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
688 -- constructor | FUNCTION body | primaryexp
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
689 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
690 if c == "<number>" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
691 v.k = "VKNUM"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
692 elseif c == "<string>" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
693 codestring(v, seminfo)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
694 elseif c == "nil" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
695 v.k = "VNIL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
696 elseif c == "true" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
697 v.k = "VTRUE"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
698 elseif c == "false" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
699 v.k = "VFALSE"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
700 elseif c == "..." then -- vararg
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
701 check_condition(fs.is_vararg == true,
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
702 "cannot use '...' outside a vararg function");
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
703 v.k = "VVARARG"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
704 elseif c == "{" then -- constructor
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
705 constructor(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
706 return
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
707 elseif c == "function" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
708 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
709 body(v, false, ln)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
710 return
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
711 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
712 primaryexp(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
713 return
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
714 end--if c
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
715 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
716 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
717
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 -- Parse subexpressions. Includes handling of unary operators and binary
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
720 -- operators. A subexpr is given the rhs priority level of the operator
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
721 -- 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
722 -- 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
723 -- in order to determine which executes first.
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
724 -- * recursively called
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
725 -- * used in expr()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
726 ------------------------------------------------------------------------
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 local function subexpr(v, limit)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
729 -- subexpr -> (simpleexp | unop subexpr) { binop subexpr }
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
730 -- * where 'binop' is any binary operator with a priority
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
731 -- higher than 'limit'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
732 local op = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
733 local uop = unopr[op]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
734 if uop then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
735 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
736 subexpr(v, UNARY_PRIORITY)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
737 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
738 simpleexp(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
739 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
740 -- expand while operators have priorities higher than 'limit'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
741 op = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
742 local binop = binopr_left[op]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
743 while binop and binop > limit do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
744 local v2 = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
745 nextt()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
746 -- read sub-expression with higher priority
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
747 local nextop = subexpr(v2, binopr_right[op])
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
748 op = nextop
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
749 binop = binopr_left[op]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
750 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
751 return op -- return first untreated operator
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
752 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
753
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 -- Expression parsing starts here. Function subexpr is entered with the
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
756 -- left operator (which is non-existent) priority of -1, which is lower
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
757 -- than all actual operators. Expr information is returned in parm v.
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
758 -- * used in cond(), explist1(), index(), recfield(), listfield(),
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
759 -- prefixexp(), while_stat(), exp1()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
760 ----------------------------------------------------------------------
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 -- this is a forward-referenced local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
763 function expr(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
764 -- expr -> subexpr
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
765 subexpr(v, 0)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
766 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
767
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 -- third level parsing functions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
770 ----------------------------------------------------------------------]]
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 -- parse a variable assignment sequence
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
774 -- * recursively called
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
775 -- * used in expr_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
776 ------------------------------------------------------------------------
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 local function assignment(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
779 local e = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
780 local c = v.v.k
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
781 check_condition(c == "VLOCAL" or c == "VUPVAL" or c == "VGLOBAL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
782 or c == "VINDEXED", "syntax error")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
783 if testnext(",") then -- assignment -> ',' primaryexp assignment
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
784 local nv = {} -- expdesc
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
785 nv.v = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
786 primaryexp(nv.v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
787 -- lparser.c deals with some register usage conflict here
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
788 assignment(nv)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
789 else -- assignment -> '=' explist1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
790 checknext("=")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
791 explist1(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
792 return -- avoid default
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
793 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
794 e.k = "VNONRELOC"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
795 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
796
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 -- parse a for loop body for both versions of the for loop
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
799 -- * used in fornum(), forlist()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
800 ----------------------------------------------------------------------
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 local function forbody(nvars, isnum)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
803 -- forbody -> DO block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
804 checknext("do")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
805 enterblock(false) -- scope for declared variables
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
806 adjustlocalvars(nvars)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
807 block()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
808 leaveblock() -- end of scope for declared variables
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
809 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
810
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 -- parse a numerical for loop, calls forbody()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
813 -- * used in for_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
814 ----------------------------------------------------------------------
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 local function fornum(varname)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
817 -- fornum -> NAME = exp1, exp1 [, exp1] DO body
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
818 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
819 new_localvarliteral("(for index)")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
820 new_localvarliteral("(for limit)")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
821 new_localvarliteral("(for step)")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
822 new_localvar(varname)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
823 checknext("=")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
824 exp1() -- initial value
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
825 checknext(",")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
826 exp1() -- limit
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
827 if testnext(",") then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
828 exp1() -- optional step
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
829 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
830 -- default step = 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
831 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
832 forbody(1, true)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
833 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
834
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 -- parse a generic for loop, calls forbody()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
837 -- * used in for_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
838 ----------------------------------------------------------------------
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 local function forlist(indexname)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
841 -- forlist -> NAME {, NAME} IN explist1 DO body
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
842 local e = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
843 -- create control variables
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
844 new_localvarliteral("(for generator)")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
845 new_localvarliteral("(for state)")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
846 new_localvarliteral("(for control)")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
847 -- create declared variables
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
848 new_localvar(indexname)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
849 local nvars = 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
850 while testnext(",") do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
851 new_localvar(str_checkname())
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
852 nvars = nvars + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
853 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
854 checknext("in")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
855 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
856 explist1(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
857 forbody(nvars, false)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
858 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
859
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 -- parse a function name specification
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
862 -- * used in func_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
863 ----------------------------------------------------------------------
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 local function funcname(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
866 -- funcname -> NAME {field} [':' NAME]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
867 local needself = false
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
868 singlevar(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
869 while tok == "." do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
870 field(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
871 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
872 if tok == ":" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
873 needself = true
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
874 field(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
875 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
876 return needself
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
877 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
878
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 -- parse the single expressions needed in numerical for loops
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
881 -- * used in fornum()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
882 ----------------------------------------------------------------------
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 -- this is a forward-referenced local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
885 function exp1()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
886 -- exp1 -> expr
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
887 local e = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
888 expr(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
889 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
890
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 -- parse condition in a repeat statement or an if control structure
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
893 -- * used in repeat_stat(), test_then_block()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
894 ----------------------------------------------------------------------
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 local function cond()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
897 -- cond -> expr
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
898 local v = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
899 expr(v) -- read condition
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
900 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
901
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 -- parse part of an if control structure, including the condition
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
904 -- * used in if_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
905 ----------------------------------------------------------------------
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 local function test_then_block()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
908 -- test_then_block -> [IF | ELSEIF] cond THEN block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
909 nextt() -- skip IF or ELSEIF
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
910 cond()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
911 checknext("then")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
912 block() -- 'then' part
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
913 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
914
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 -- parse a local function statement
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
917 -- * used in local_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
918 ----------------------------------------------------------------------
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 local function localfunc()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
921 -- localfunc -> NAME body
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
922 local v, b = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
923 new_localvar(str_checkname())
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
924 v.k = "VLOCAL"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
925 adjustlocalvars(1)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
926 body(b, false, ln)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
927 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
928
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 -- parse a local variable declaration statement
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
931 -- * used in local_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
932 ----------------------------------------------------------------------
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 local function localstat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
935 -- localstat -> NAME {',' NAME} ['=' explist1]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
936 local nvars = 0
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
937 local e = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
938 repeat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
939 new_localvar(str_checkname())
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
940 nvars = nvars + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
941 until not testnext(",")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
942 if testnext("=") then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
943 explist1(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
944 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
945 e.k = "VVOID"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
946 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
947 adjustlocalvars(nvars)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
948 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
949
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 -- parse a list of comma-separated expressions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
952 -- * used in return_stat(), localstat(), funcargs(), assignment(),
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
953 -- forlist()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
954 ----------------------------------------------------------------------
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 -- this is a forward-referenced local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
957 function explist1(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
958 -- explist1 -> expr { ',' expr }
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
959 expr(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
960 while testnext(",") do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
961 expr(e)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
962 end
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
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 -- parse function declaration body
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
967 -- * used in simpleexp(), localfunc(), func_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
968 ----------------------------------------------------------------------
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 -- this is a forward-referenced local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
971 function body(e, needself, line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
972 -- body -> '(' parlist ')' chunk END
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
973 open_func()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
974 checknext("(")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
975 if needself then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
976 new_localvarliteral("self", true)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
977 adjustlocalvars(1)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
978 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
979 parlist()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
980 checknext(")")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
981 chunk()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
982 check_match("end", "function", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
983 close_func()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
984 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
985
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 -- parse a code block or unit
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
988 -- * used in do_stat(), while_stat(), forbody(), test_then_block(),
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
989 -- if_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
990 ----------------------------------------------------------------------
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 -- this is a forward-referenced local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
993 function block()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
994 -- block -> chunk
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
995 enterblock(false)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
996 chunk()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
997 leaveblock()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
998 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
999
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 -- second level parsing functions, all with '_stat' suffix
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1002 -- * since they are called via a table lookup, they cannot be local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1003 -- functions (a lookup table of local functions might be smaller...)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1004 -- * stat() -> *_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1005 ----------------------------------------------------------------------]]
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 -- initial parsing for a for loop, calls fornum() or forlist()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1009 -- * removed 'line' parameter (used to set debug information only)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1010 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1011 ----------------------------------------------------------------------
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 function for_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1014 -- stat -> for_stat -> FOR (fornum | forlist) END
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1015 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1016 enterblock(true) -- scope for loop and control variables
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1017 nextt() -- skip 'for'
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1018 local varname = str_checkname() -- first variable name
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1019 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1020 if c == "=" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1021 fornum(varname)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1022 elseif c == "," or c == "in" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1023 forlist(varname)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1024 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1025 syntaxerror("'=' or 'in' expected")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1026 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1027 check_match("end", "for", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1028 leaveblock() -- loop scope (`break' jumps to this point)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1029 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1030
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 -- parse a while-do control structure, body processed by block()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1033 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1034 ----------------------------------------------------------------------
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 function while_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1037 -- stat -> while_stat -> WHILE cond DO block END
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1038 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1039 nextt() -- skip WHILE
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1040 cond() -- parse condition
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1041 enterblock(true)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1042 checknext("do")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1043 block()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1044 check_match("end", "while", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1045 leaveblock()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1046 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1047
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 -- parse a repeat-until control structure, body parsed by chunk()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1050 -- * originally, repeatstat() calls breakstat() too if there is an
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1051 -- upvalue in the scope block; nothing is actually lexed, it is
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1052 -- actually the common code in breakstat() for closing of upvalues
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1053 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1054 ----------------------------------------------------------------------
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 function repeat_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1057 -- stat -> repeat_stat -> REPEAT block UNTIL cond
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1058 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1059 enterblock(true) -- loop block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1060 enterblock(false) -- scope block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1061 nextt() -- skip REPEAT
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1062 chunk()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1063 check_match("until", "repeat", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1064 cond()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1065 -- close upvalues at scope level below
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1066 leaveblock() -- finish scope
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1067 leaveblock() -- finish loop
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1068 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1069
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 -- parse an if control structure
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1072 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1073 ----------------------------------------------------------------------
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 function if_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1076 -- stat -> if_stat -> IF cond THEN block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1077 -- {ELSEIF cond THEN block} [ELSE block] END
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1078 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1079 local v = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1080 test_then_block() -- IF cond THEN block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1081 while tok == "elseif" do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1082 test_then_block() -- ELSEIF cond THEN block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1083 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1084 if tok == "else" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1085 nextt() -- skip ELSE
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1086 block() -- 'else' part
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1087 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1088 check_match("end", "if", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1089 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1090
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 -- parse a return statement
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1093 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1094 ----------------------------------------------------------------------
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 function return_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1097 -- stat -> return_stat -> RETURN explist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1098 local e = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1099 nextt() -- skip RETURN
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1100 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1101 if block_follow[c] or c == ";" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1102 -- return no values
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1103 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1104 explist1(e) -- optional return values
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1105 end
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
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 -- parse a break statement
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1110 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1111 ----------------------------------------------------------------------
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 function break_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1114 -- stat -> break_stat -> BREAK
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1115 local bl = fs.bl
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1116 nextt() -- skip BREAK
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1117 while bl and not bl.isbreakable do -- find a breakable block
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1118 bl = bl.prev
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1119 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1120 if not bl then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1121 syntaxerror("no loop to break")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1122 end
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
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 -- parse a function call with no returns or an assignment statement
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1127 -- * the struct with .prev is used for name searching in lparse.c,
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1128 -- so it is retained for now; present in assignment() also
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1129 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1130 ----------------------------------------------------------------------
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 function expr_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1133 -- stat -> expr_stat -> func | assignment
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1134 local v = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1135 v.v = {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1136 primaryexp(v.v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1137 if v.v.k == "VCALL" then -- stat -> func
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1138 -- call statement uses no results
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1139 else -- stat -> assignment
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1140 v.prev = nil
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1141 assignment(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1142 end
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
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 -- parse a function statement
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1147 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1148 ----------------------------------------------------------------------
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 function function_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1151 -- stat -> function_stat -> FUNCTION funcname body
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1152 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1153 local v, b = {}, {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1154 nextt() -- skip FUNCTION
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1155 local needself = funcname(v)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1156 body(b, needself, line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1157 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1158
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 -- parse a simple block enclosed by a DO..END pair
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1161 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1162 ----------------------------------------------------------------------
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 function do_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1165 -- stat -> do_stat -> DO block END
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1166 local line = line
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1167 nextt() -- skip DO
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1168 block()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1169 check_match("end", "do", line)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1170 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1171
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 -- parse a statement starting with LOCAL
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1174 -- * used in stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1175 ----------------------------------------------------------------------
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 function local_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1178 -- stat -> local_stat -> LOCAL FUNCTION localfunc
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1179 -- -> LOCAL localstat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1180 nextt() -- skip LOCAL
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1181 if testnext("function") then -- local function?
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1182 localfunc()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1183 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1184 localstat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1185 end
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
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 -- main functions, top level parsing functions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1190 -- * accessible functions are: init(lexer), parser()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1191 -- * [entry] -> parser() -> chunk() -> stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1192 ----------------------------------------------------------------------]]
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 -- initial parsing for statements, calls '_stat' suffixed functions
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1196 -- * used in chunk()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1197 ----------------------------------------------------------------------
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 local function stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1200 -- stat -> if_stat while_stat do_stat for_stat repeat_stat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1201 -- function_stat local_stat return_stat break_stat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1202 -- expr_stat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1203 line = ln -- may be needed for error messages
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1204 local c = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1205 local fn = stat_call[c]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1206 -- handles: if while do for repeat function local return break
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1207 if fn then
85
347ac1733354 Remove uses of getfenv to work around Lua/LuaJIT inconsistency, and as a step towards 5.2 compatibility (thanks mva, Zash)
Matthew Wild <mwild1@gmail.com>
parents: 1
diff changeset
1208 _M[fn]()
1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1209 -- return or break must be last statement
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1210 if c == "return" or c == "break" then return true end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1211 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1212 expr_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1213 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1214 return false
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1215 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1216
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 -- parse a chunk, which consists of a bunch of statements
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1219 -- * used in parser(), body(), block(), repeat_stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1220 ----------------------------------------------------------------------
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 -- this is a forward-referenced local
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1223 function chunk()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1224 -- chunk -> { stat [';'] }
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1225 local islast = false
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1226 while not islast and not block_follow[tok] do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1227 islast = stat()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1228 testnext(";")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1229 end
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
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 -- performs parsing, returns parsed data structure
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1234 ----------------------------------------------------------------------
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 function parser()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1237 open_func()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1238 fs.is_vararg = true -- main func. is always vararg
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1239 nextt() -- read first token
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1240 chunk()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1241 check("<eof>")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1242 close_func()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1243 return globalinfo, localinfo
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1244 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1245
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 -- initialization function
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1248 ----------------------------------------------------------------------
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 function init(tokorig, seminfoorig, toklnorig)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1251 tpos = 1 -- token position
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1252 top_fs = {} -- reset top level function state
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1253 ------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1254 -- set up grammar-only token tables; impedance-matching...
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1255 -- note that constants returned by the lexer is source-level, so
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1256 -- for now, fake(!) constant tokens (TK_NUMBER|TK_STRING|TK_LSTRING)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1257 ------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1258 local j = 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1259 toklist, seminfolist, toklnlist, xreflist = {}, {}, {}, {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1260 for i = 1, #tokorig do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1261 local tok = tokorig[i]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1262 local yep = true
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1263 if tok == "TK_KEYWORD" or tok == "TK_OP" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1264 tok = seminfoorig[i]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1265 elseif tok == "TK_NAME" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1266 tok = "<name>"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1267 seminfolist[j] = seminfoorig[i]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1268 elseif tok == "TK_NUMBER" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1269 tok = "<number>"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1270 seminfolist[j] = 0 -- fake!
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1271 elseif tok == "TK_STRING" or tok == "TK_LSTRING" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1272 tok = "<string>"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1273 seminfolist[j] = "" -- fake!
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1274 elseif tok == "TK_EOS" then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1275 tok = "<eof>"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1276 else
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1277 -- non-grammar tokens; ignore them
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1278 yep = false
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1279 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1280 if yep then -- set rest of the information
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1281 toklist[j] = tok
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1282 toklnlist[j] = toklnorig[i]
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1283 xreflist[j] = i
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1284 j = j + 1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1285 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1286 end--for
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1287 ------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1288 -- initialize data structures for variable tracking
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1289 ------------------------------------------------------------------
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1290 globalinfo, globallookup, localinfo = {}, {}, {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1291 ilocalinfo, ilocalrefs = {}, {}
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1292 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1293
85
347ac1733354 Remove uses of getfenv to work around Lua/LuaJIT inconsistency, and as a step towards 5.2 compatibility (thanks mva, Zash)
Matthew Wild <mwild1@gmail.com>
parents: 1
diff changeset
1294 return _M

mercurial