[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 ;