[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Decomposition of grammars
- From: Gavin Wraith <gavin@...>
- Date: Fri, 06 Jan 2012 16:47:35 GMT
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/