views:

96

answers:

1

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?

A: 

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 if expression fails and fails if expression 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":

( !expression . )* ie. "match anything BUT expression"
clyfe