Peter, This is fantastic, thank you.
Help me understand: A <- B `C 'd' B <- 'b' C <- 'c' Here production A includes two non-terminal (B and C) and one terminal ('d') rule. Do I understand that 'd' in this case does *not* produce a node in the syntax tree, but that rule B and C do? But that after C generates a node, the ` arranges not to have it placed in the syntax tree? If so, what rule do you use to disambiguate the case where 'd' does not produce a node but 'b' does? -Alan On Fri, Dec 10, 2010 at 09:53:42AM +1300, Peter Cashin wrote: > Hi Alan > I have been working on grammar rules I'm calling PBNF, for Parser-BNF, > that can be automatically executed as a parser. The PEG operators are a > subset of the PBNF operators, but to fully automate a grammar I need to > define the implicit syntax tree that the grammar rules specify. > Your issue comes up all the time in that context: my approach is to have a > literal 'x' match without producing a syntax tree node (you can always add > a rule if you do want it in the syntax tree). Rules that generate leaf > nodes are designated in the grammar, they are terminal rules if you like, > so they generate a literal match (but no internal syntax sub-tree). But > sometimes you want to reference a rule but still not to generate a syntax > tree node, and I have used the `x operator: the ` prefix is a sort of > quote like, and its unobtrusive in the grammar. > If you want to take a look you will find it all at: > [1]http://github.com/spinachtree/gist > Maybe other people have different solutions, I'd like to know.. > Cheers, > Peter. > > On Fri, Dec 10, 2010 at 9:01 AM, Alan Post > <[2]alanp...@sunflowerriver.org> wrote: > > I'm working on my PEG parser, in particular the interface between > the parse tree and the code one can attach to productions that > are executed on a successful parse. > > I've arranged for the two predicate operations, & and !, to not add > any output to the parse tree. That means that the following > production: > > rule <- &a !b "c" > > Produces the same parse tree as: > > rule <- "c" > > Internally, this means that I recognize that the sequence operator > (which contains the productions '&a', '!b', and '"c"' in this > example) is being called with predicates in every position but one, > and rather than returning a list containing that single element, > I return just the single element. > > As I've been doing this, I've found that I want a new operator similar > to '&'. '&' matches the production it is attached to, but it does not > advance the position of the input buffer. > > I'd like an operator that matches the production it is attached to, > advances the input buffer, but doesn't add anything to the parse > tree. > > Here's an example: > > mulexp <- digit '*' digit EOF -> {(lambda (x y) (* x y))} > > the mulexp production is a sequence of four other rules, but only > two of them are needed by the associated code. It would be nice > if I could write the code rule like it is above, rather than say > this: > > (lambda (x op y EOF) (* x y)) > > Having to account for all the rules in the sequence, but really > only caring about two of them. Here is the example rewritten > with '^' expressing "match the rule, advance the input, but don't > modify the parse tree": > > mulexp <- digit ^'*' digit ^EOF -> {(lambda (x y) (* x y))} > > Before I go inventing syntax for this use case, will you tell me if > this is already being done with other parsers? Have any of you had > this problem and already solved it, and if so, what approach did you > take? > > -Alan > -- > .i ko djuno fi le do sevzi > > _______________________________________________ > PEG mailing list > [3]...@lists.csail.mit.edu > [4]https://lists.csail.mit.edu/mailman/listinfo/peg > > References > > Visible links > 1. http://github.com/spinachtree/gist > 2. mailto:alanp...@sunflowerriver.org > 3. mailto:PEG@lists.csail.mit.edu > 4. https://lists.csail.mit.edu/mailman/listinfo/peg > _______________________________________________ > PEG mailing list > PEG@lists.csail.mit.edu > https://lists.csail.mit.edu/mailman/listinfo/peg -- .i ko djuno fi le do sevzi _______________________________________________ PEG mailing list PEG@lists.csail.mit.edu https://lists.csail.mit.edu/mailman/listinfo/peg