[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: LPEG and indentation based syntax
 
- From: Niklas Frykholm <niklas@...>
 
- Date: Fri, 13 Apr 2007 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