From: Aaron Patterson Date: 2007-10-30T01:05:38+09:00 Subject: Re: Racc error recovery On Mon, Oct 29, 2007 at 03:40:02AM +0900, barjunk wrote: > On Oct 25, 10:29 pm, Aaron Patterson > wrote: > > On Thu, Oct 25, 2007 at 02:14:20PM +0900, Giles Bowkett wrote: > > > > I'm writing a racc parser, and I need to recover from parse errors. > > > ... > > > > Unfortunately I can't seem to find any good documentation or examples on > > > > error recovery. I've read the Racc documentation about on_error and > > > > > Wild stab in the dark: is there any equivalent stuff in yacc you could > > > use as a starting point? > > > > Yes there is. I was hoping I could get an answer without digging up my > > lex & yacc book. ;-) Fortunately I found it and there is an error > > recovery section that has definitely helped. > > > > > > > > > I realize it probably isn't modeled that closely, but that's the first > > > thought I had. > > > > > Wild stab in the dark, part 2: tried using Sass instead? It's a CSS > > > DSL. Or do you have to work with the CSS you've already got? > > > > No. I'm trying to parse CSS, not generate it. > > > > -- > > Aaron Pattersonhttp://tenderlovemaking.com/ > > Aaron, > > Would you mind sharing some of what you found in the book? I'm more > interested in what you were thinking originally and then what the book > had to say to change your mind. What I was thinking originally was that on_error could eat up tokens until the grammar could be recovered. Then, after reading the lex/yacc book I found out that that is exactly what the "error" token does. Take this grammar/script for example: class Tester token A LBRACE rule a_a_lbrace : A A LBRACE { puts val } | A error LBRACE { puts "got error"; puts val } ; end require 'tester.tab' class Foo < Tester def initialize @tokens = [ [ :A, 'a' ], [ :B, 'b' ], [ :LBRACE, '{' ], ] end def parse do_parse end def next_token @tokens.shift end end Foo.new.parse The second rule gets called, and Racc uses LBRACE as a "pivot point" (IIRC, that is what the yacc book called it). The error rule will eat up tokens until an LBRACE is found. Then parsing can continue as usual. Unfortunately, I'm not sure when on_error is supposed to be called. I'm also having a hard time figuring out where to place the error token in some of my rules. But I am going to start a new thread about that. -- Aaron Patterson http://tenderlovemaking.com/