When is on_error supposed to be called?  Will on_error be called when
the error rule is triggered?

After reading the lex/yacc book, it seems as though the error rule is
supposed to eat up tokens until it can find a pivot token.  But is
on_error supposed to be called?  I did a couple experiments and found
that on_error is not called if the error rule matches only one token,
but if it matches many tokens on_error is called.

Consider the following grammar:

  class Tester
  
    token A LBRACE
  
  rule
    a_a_lbrace
      : A A LBRACE { puts val }
      | A error LBRACE { puts "recovered"; puts val }
      ;
  
  end

and the following script:

  class Foo < Tester
    def initialize
      @tokens = [
        [ :A, 'a' ],
        [ :b, 'b' ],
        [ :LBRACE, '{' ],
        [ false, false ],
      ]
    end
  
    def parse; do_parse; end
  
    def next_token; @tokens.shift; end
  
    def on_error(*args)
      puts "on_error called"
    end
  end
  
  Foo.new.parse

on_error does not get called, but the recovery rule matches.  However,
change the tokens to this:

      @tokens = [
        [ :A, 'a' ],
        [ :b, 'b' ],
        [ :b, 'b' ],
        [ :b, 'b' ],
        [ :LBRACE, '{' ],
        [ false, false ],
      ]

on_error gets called *and* the recover rule matches.  It seems on_error
gets called if the error rule matches > 1 token.  Is that expected
behavior?  Am I using the error rule correctly?

Any help would be greatly appreciated.  Thanks!

-- 
Aaron Patterson
http://tenderlovemaking.com/