LPEG and indentation based syntax
[
Date Prev][
Date Next][
Thread Prev][
Thread Next]
[
Date Index]
[
Thread Index]
- Subject: LPEG and indentation based syntax
- From: Niklas Frykholm <niklas@...>
- Date: 2007年4月13日 18:07:38 +0200
I've been playing around a bit with LPEG and I really like it. LPEG is
to Regexp as Lua is to Perl.
Does anyone have any bright ideas on how to parse indentation-based
syntaxes with LPEG. So far, the best I have is:
function indent(s)
local row = lpeg.C((1 - lpeg.P('\n'))^0) * lpeg.P('\n')
local i = lpeg.P(' ')
function node(name, ...) return {name=name, children={...}} end
local maxdepth = 4
local indent = {lpeg.P(true)}
for j=2,maxdepth do indent[j] = indent[j-1]*i end
local indentrow = {[maxdepth] = indent[maxdepth] * row / node}
for j=maxdepth-1,1,-1 do
indentrow[j] = indent[j] * row *indentrow[j+1]^0 / node
end
local file = lpeg.Ct(indentrow[1]^0)
return lpeg.match(file, s)
end
r = indent [[
1
1.1
1.2
1.2.1
1.2.2
1.3
1.3.1
1.3.1.1
1.3.1.2
1.3.2
1.4
2
2.1
]]
It works, but it is not so nice that it has a fixed maximum indentation
depth and needs to define symbols for all indentation levels.
// Niklas