I have a simple grammar setup like so:
grammar Test rule line (adjective / not_adjective)* { def content elements.map{|e| e.content } end } end rule adjective ("good" / "bad" / "excellent") { def content [:adjective, text_value] end } end rule not_adjective !adjective { def content [:not_adjective, text_value] end } end end
Let's say my input is "this is a good ball. let's use it". This gives an error, which I'm not mentioning right now because I want to understand the theory about why its wrong first. So, how do I create rule not_adjective so that it matches anything that is not matched by rule adjective? In general, how to I write I rule (specifically in Treetop) that "doesnt" match another named rule?
Treetop is a parser generator that generates parsers out of a special class of grammars called Parsing Expression Grammars or PEG.
The operational interpretation of
!expression
is that it succeeds ifexpression
fails and fails ifexpression
succeeds but it consumes NO input.To match anything that rule
expression
does not match use the dot operator (that matches anything) in conjunction with the negation operator to avoid certain "words":