lua-users home
lua-l archive

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


2011/3/31 Roberto Ierusalimschy <roberto@inf.puc-rio.br>:
>> After watching the talk about LPeg I was inspired to use it to
>> describe the grammar of my DSL.
>> I now have a complete PEG grammar (LPEG.RE) of about 300 lines, but
>> can't find a good pointer on how to generate an AST or parse tree with
>> callbacks from it.
>> Other PEG implementations do offer this functionality (e.g.
>> http://boshi.inimino.org/3box/PanPG/build/demo.html).
>>
>> [...]
>>
>> Do I have to do this for every non-terminal I specified? Is there
>> a better way to do this?
>
> There is no automatic way to generate an AST in LPeg; you have to do it
> "manually". But there are several ways to do it. One way is what you are
> doing. Another possiblility is like this. Assume an original grammar
> segment like here:
>
>  S <- A B C
>    |  E e F
>
> You may rewrite it like this:
>
>  S <- ( {:tag: ''->'R1':} A B C ) -> {}
>     | ( {:tag: ''->'R2':} E {e} F ) -> {}
>
> These captures will generate the entire AST for you. Each inner node
> is a table with a 'tag' field (which describes the production that
> generated that node) and fields [1], [2], etc. with the node sibblings.
>
> You may also play with re.lua and add another rule to ease your job. For
> instance, you might write only
>
>  S <- ( A B C ) @R1
>     | ( E {e} F ) @R2
>
> and add a rule for 'Suffix' in re.lua to treat '@name' as 'create a
> capture table with a tag with the given name'.
>
> Yet another option is to follow your style, but to play with the __index
> metamehtod of the table that you pass to re.compile so that you do not
> need to define one function for each production; the metamethod creates
> the function for you.
>
> -- Roberto
>
>

Those are very good ideas, thanks Roberto! Issue solved:)