lua-users home
lua-l archive

Re: Decomposition of grammars

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


In message 
<CACh33Fo+K0Hyvt_xcDVhaM3txYZ+=LO8Ta3EUE+1aTikTOdygQ@mail.gmail.com> 
you wrote:
> Take a look at the Lua Parser on [1]. 
> [1] http://lua-users.org/wiki/LpegRecipes
Thanks. 
> Some other changes you can do to make the code as compact as possible:
I am not too concerned about compactness. More interesting to my mind
is the choice of representation of parse tree that lpeg.match
should return.
Just for reference here is my (no doubt buggy) code - it uses
Peter Shook's patch, '\' for 'function' and '=>' for 'return'. 
The source to be analysed is held in the file named by arg[1].
 #! lua
 -- strip out comments from Lua source
 local S,P,Cg,C,Cmt,Cb,Ct,match in lpeg
 local ret = P "\n"
 
 local shortstring
 local squote, dquote = P "'", P '"'
 do
 local slash, blank = P "\\", ret + " "
 local z = slash*"z"*( blank^0 )
 local esc = slash*(1 - blank)
 local sq = squote*(z + esc + 1 - (squote + slash + ret))^0*squote
 local dq = dquote*(z + esc + 1 - (dquote + slash + ret))^0*dquote
 shortstring = C(sq + dq)
 end
 
 local longstring
 do
 local bra,ket,eqs= P "[",P "]",(P "=")^0
 local open = bra*Cg(eqs,"init")*bra*ret^(-1)
 local close = ket*C(eqs)*ket
 local closeeq = Cmt(close*(Cb "init"),\(s,i,a,b) => a==b end)
 longstring = C(open*((1-closeeq)^0)*close)/(\(s,_) => s end)
 end
 
 local anystring = shortstring + longstring
 
 local strip
 do
 local mm = P "--"
 local comment = mm*(longstring + C((1 - ret)^0))/\(...) => "" end
 local notcomment = (anystring + C(1 - squote - dquote - mm))^1
 strip = Ct((comment + notcomment)^0)/table.concat
 end
 
 local f = io.open(arg[1],"r")
 local s = f:read "*a"
 f:close()
 
 print(strip:match(s))
I think I know what the right mathematical definition of subgrammar
is now. But I do not want to inflict 2-categories on this list ;)
-- 
Gavin Wraith (gavin@wra1th.plus.com)
Home page: http://www.wra1th.plus.com/

AltStyle によって変換されたページ (->オリジナル) /