Hi there! I need to wite a parser. I tried to do it using the pegs module. I wrote my grammar and it works, it recognizez strings. But now I need to write some actions to actually build a syntactic tree while parsing. I need to access the captured portions while parsing. Something like: import strutils, pegs let grammar = peg """ terms <- ^ term+ $ term <- \letter* {\d+} \n+ """ let example = """a1 b2 c3 """ let parseExample = grammar.eventParser: pkNonTerminal: enter: # p, s, start if p.nt.name=="term": echo " It seems like a new term, let's check it..." leave: # p, s, start, length (length = -1 in case of failure) if p.nt.name=="term" and length >= 1: echo "Yes indeed, it's a term and I captured this: '", $1, "'" let pLen = parseExample(example) echo pLen Run
The result is: It seems like a new term, let's check it... Yes indeed, it's a term and I captured this: '1' It seems like a new term, let's check it... Yes indeed, it's a term and I captured this: '1' It seems like a new term, let's check it... Yes indeed, it's a term and I captured this: '1' It seems like a new term, let's check it... 9 Run Obviously, $1 is not understood as "the first captured string", but as the string representation of a literal 1. How can I access the captured strings for use in the enter/leave procs? PS: Maybe I'm doing it wrong. I intend to use the whole grammar (about 20-30 rules) to parse a file in one shot. Is this approach OK?