aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/LuaSL/testLua/yueliang-0.4.1/nat-5.0.3/llex_mk3.lua
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--LuaSL/testLua/yueliang-0.4.1/nat-5.0.3/llex_mk3.lua266
1 files changed, 0 insertions, 266 deletions
diff --git a/LuaSL/testLua/yueliang-0.4.1/nat-5.0.3/llex_mk3.lua b/LuaSL/testLua/yueliang-0.4.1/nat-5.0.3/llex_mk3.lua
deleted file mode 100644
index 1cd22b5..0000000
--- a/LuaSL/testLua/yueliang-0.4.1/nat-5.0.3/llex_mk3.lua
+++ /dev/null
@@ -1,266 +0,0 @@
1--[[--------------------------------------------------------------------
2
3 llex.lua
4 Lua 5 lexical analyzer in Lua
5 This file is part of Yueliang.
6
7 Copyright (c) 2006 Kein-Hong Man <khman@users.sf.net>
8 The COPYRIGHT file describes the conditions
9 under which this software may be distributed.
10
11 See the ChangeLog for more information.
12
13----------------------------------------------------------------------]]
14
15--[[--------------------------------------------------------------------
16-- Notes:
17-- * takes in the entire source at once
18-- * code is heavily optimized for size
19--
20-- local lex_init = require("llex.lua")
21-- local llex = lex_init(z, source)
22-- llex:chunkid()
23-- * returns formatted name of chunk id
24-- llex:errorline(s, line)
25-- * throws an error with a formatted message
26-- llex:lex()
27-- * returns next lexical element (token, seminfo)
28-- llex.ln
29-- * line number
30----------------------------------------------------------------------]]
31
32return
33function(z, source)
34 --------------------------------------------------------------------
35 -- initialize variables
36 -- * I is the upvalue, i is the local version for space/efficiency
37 --------------------------------------------------------------------
38 local string = string
39 local find, sub = string.find, string.sub
40 local EOF = "<eof>"
41 local luaX = { ln = 1 }
42 local I = 1
43 --------------------------------------------------------------------
44 -- initialize keyword list
45 --------------------------------------------------------------------
46 local kw = {}
47 for v in string.gfind([[
48and break do else elseif end false for function if in
49local nil not or repeat return then true until while]], "%S+") do
50 kw[v] = true
51 end
52 --------------------------------------------------------------------
53 -- returns a chunk name or id
54 --------------------------------------------------------------------
55 function luaX:chunkid()
56 if find(source, "^[=@]") then
57 return sub(source, 2) -- remove first char
58 end
59 return "[string]"
60 end
61 --------------------------------------------------------------------
62 -- formats error message and throws error
63 -- * a simplified version, does not report what token was responsible
64 --------------------------------------------------------------------
65 function luaX:errorline(s, line)
66 error(string.format("%s:%d: %s", self:chunkid(), line or self.ln, s))
67 end
68 ----------------------------------------------------------------------
69 -- reads a long string or long comment
70 ----------------------------------------------------------------------
71 local function read_long(i, is_str)
72 local luaX = luaX
73 local string = string
74 local cont = 1
75 if sub(z, i, i) == "\n" then
76 i = i + 1
77 luaX.ln = luaX.ln + 1
78 end
79 local j = i
80 while true do
81 local p, q, r = find(z, "([\n%[%]])", i) -- (long range)
82 if not p then
83 luaX:errorline(is_str and "unfinished long string" or
84 "unfinished long comment")
85 end
86 i = p + 1
87 if r == "\n" then
88 luaX.ln = luaX.ln + 1
89 elseif sub(z, i, i) == r then -- only [[ or ]]
90 i = i + 1
91 if r == "[" then
92 cont = cont + 1
93 else-- r == "]" then
94 if cont == 1 then break end -- last ]] found
95 cont = cont - 1
96 end
97 end
98 end--while
99 I = i
100 return sub(z, j, i - 3)
101 end
102 ----------------------------------------------------------------------
103 -- reads a string
104 ----------------------------------------------------------------------
105 local function read_string(i, del)
106 local luaX = luaX
107 local string = string
108 local buff = ""
109 while true do
110 local p, q, r = find(z, "([\n\\\"\'])", i) -- (long range)
111 if p then
112 if r == "\n" then
113 luaX:errorline("unfinished string")
114 end
115 buff = buff..sub(z, i, p - 1) -- normal portions
116 i = p
117 if r == "\\" then -- handle escapes
118 i = i + 1
119 r = sub(z, i, i)
120 if r == "" then break end -- (error)
121 p = find("\nabfnrtv", r, 1, 1)
122 ------------------------------------------------------
123 if p then -- special escapes
124 r = sub("\n\a\b\f\n\r\t\v", p, p)
125 if p == 1 then luaX.ln = luaX.ln + 1 end
126 i = i + 1
127 ------------------------------------------------------
128 elseif find(r, "%D") then -- other non-digits
129 i = i + 1
130 ------------------------------------------------------
131 else -- \xxx sequence
132 local p, q, s = find(z, "^(%d%d?%d?)", i)
133 i = q + 1
134 if s + 1 > 256 then -- UCHAR_MAX
135 luaX:errorline("escape sequence too large")
136 end
137 r = string.char(s)
138 ------------------------------------------------------
139 end--if p
140 else
141 i = i + 1
142 if r == del then
143 I = i
144 return buff -- ending delimiter
145 end
146 end--if r
147 buff = buff..r
148 else
149 break -- (error)
150 end--if p
151 end--while
152 luaX:errorline("unfinished string")
153 end
154 ----------------------------------------------------------------------
155 -- main lexer function
156 ----------------------------------------------------------------------
157 function luaX:lex()
158 local string = string
159 local find, len = find, string.len
160 while true do--outer
161 local i = I
162 -- inner loop allows break to be used to nicely section tests
163 while true do--inner
164 ----------------------------------------------------------------
165 local p, _, r = find(z, "^([_%a][_%w]*)", i)
166 if p then
167 I = i + len(r)
168 if kw[r] then return r end -- keyword
169 return "<name>", r -- identifier
170 end
171 ----------------------------------------------------------------
172 local p, q, r = find(z, "^(%.?)%d", i)
173 if p then -- numeral
174 if r == "." then i = i + 1 end
175 local _, n, r, s = find(z, "^%d*(%.?%.?)%d*([eE]?)", i)
176 q = n
177 i = q + 1
178 if len(r) == 2 then
179 self:errorline("ambiguous syntax (dots follows digits)")
180 end
181 if len(s) == 1 then -- optional exponent
182 local _, n = find(z, "^[%+%-]?%d*", i) -- optional sign
183 q = n
184 i = q + 1
185 end
186 r = tonumber(sub(z, p, q))
187 I = i
188 if not r then self:errorline("malformed number") end
189 return "<number>", r
190 end
191 ----------------------------------------------------------------
192 local p, q, r = find(z, "^(%s)[ \t]*", i)
193 if p then
194 if r == "\n" then -- newline
195 self.ln = self.ln + 1
196 I = i + 1
197 else
198 I = q + 1 -- whitespace
199 end
200 break -- (continue)
201 end
202 ----------------------------------------------------------------
203 local p, _, r = find(z, "^(%p)", i) -- symbols/punctuation
204 if p then
205 local q = find("-[\"\'.=<>~", r, 1, 1)
206 if q then -- further processing for more complex symbols
207 ----------------------------------------------------
208 if q <= 2 then
209 if q == 1 then -- minus
210 if find(z, "^%-%-", i) then
211 i = i + 2
212 if find(z, "^%[%[", i) then -- long comment
213 read_long(i + 2)
214 else -- short comment
215 I = find(z, "\n", i) or (len(z) + 1)
216 end
217 break -- (continue)
218 end
219 -- (fall through for "-")
220 elseif q == 2 then -- [ or long string
221 if find(z, "^%[%[", i) then
222 return "<string>", read_long(i + 2, true)
223 end
224 -- (fall through for "[")
225 end
226 ----------------------------------------------------
227 elseif q <= 5 then
228 if q < 5 then -- strings
229 return "<string>", read_string(i + 1, r)
230 end
231 local _, _, s = find(z, "^(%.%.?%.?)", i) -- dots
232 r = s
233 -- (fall through)
234 ----------------------------------------------------
235 else -- relational/logic
236 local _, _, s = find(z, "^(%p=?)", i)
237 r = s
238 -- (fall through)
239 end
240 end
241 I = i + len(r); return r -- for other symbols, fall through
242 end
243 ----------------------------------------------------------------
244 local r = sub(z, i, i)
245 if r ~= "" then
246 if find(r, "%c") then -- invalid control char
247 self:errorline("invalid control char("..string.byte(r)..")")
248 end
249 I = i + 1; return r -- other single-char tokens
250 end
251 return EOF -- end of stream
252 ----------------------------------------------------------------
253 end--while inner
254 end--while outer
255 end
256 --------------------------------------------------------------------
257 -- initial processing (shbang handling)
258 --------------------------------------------------------------------
259 local p, q, r = find(z, "^#[^\n]*(\n?)")
260 if p then -- skip first line
261 I = q + 1
262 if r == "\n" then luaX.ln = luaX.ln + 1 end
263 end
264 return luaX
265 --------------------------------------------------------------------
266end