[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Pushback buffer overflow exception



Hi,

I get an "IOException: Pushback buffer overflow" with the SableCC grammar
appended below.

Test 1:    "[+-]"
Parsing this string leads to pushback buffer overflow. The problem seems to
arise from the competition between T.range and T.class_char.

Test 2:    "[\a]"
When I use the commented alternative to T.class_char (i.e. "{ charclass }
class_char = class_char ;"), I get a pushback buffer overflow exception on
any backslash escaped character occurring within brackets.
I guess this is a SableCC bug, since the expected exception should be a
LexerException.

Any help is greatly appreciated!
Franz


PS: I have a JUnit test for the above cases. I'll be happy to send a zip.

PPS: Can anyone point me to a SableCC grammar for regular expressions?


/**********  GRAMMAR **********/
Package quoted_char;

Helpers

  all            = [ 0 .. 0xffff ] ;

//   metacharacters
  esc            = '\' ;  //'
  hyphen         = '-' ;
  l_bracket      = '[' ;
  r_bracket      = ']' ;

//   general
  plain_ch              = all ;
  quoted_ch             = esc plain_ch ;
  class_char            = [ plain_ch - r_bracket ];


States
//   The first state is the initial state
  normal ,
  charclass ;


Tokens

  { normal->charclass }  l_bracket = l_bracket ;

  { charclass->normal }  r_bracket = r_bracket ;

  { charclass }  range  = (class_char|quoted_ch) hyphen
(class_char|quoted_ch);
//  { charclass }  class_char = class_char ;
  { charclass }  class_char = (class_char|quoted_ch) ;

  { normal }  plain_ch   =  plain_ch ;
  { normal }  quoted_ch  =  quoted_ch ;


Productions

  char =
        {plain}         T.plain_ch              |
        {quoted}        T.quoted_ch             |
        {class}         ch_class                ;

  // character class
  ch_class =
        T.l_bracket  ch_class_unit+  T.r_bracket ;

  ch_class_unit =
        {single}        T.class_char            |
        {range}         T.range                 ;