[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Getting verbose output from the parser
I am not an expert in the subject but anyway I think you would better
let the lexer "decide" what's a float literal (that's it, define it in
the Helpers/Tokens section).
You can find already tested ways of defining float_literals on SableCC
site, grammars section
http://sablecc.org/grammars.html
http://sablecc.org/grammars/ISOC.grammar.html
http://sablecc.org/grammars/j14.sablecc.html
Please not that many of those grammars have an interpreter/parser,etc.
associated that can be obtained by clicking on the Download link (did
not notice this at first):
http://sourceforge.net/project/showfiles.php?group_id=5704
etc.
Greg
Helpers
floating_constant =
decimal_floating_constant |
hex_floating_constant;
Tokens
On 6/10/06, Stephen Torri <storri@xxxxxxxxx> wrote:
Is there a way to get more verbose output from the parser than just a
ParserException? I need to develop a parser which can recognize the C++
programming language. For starters I am working on the recognizing two
basic types, floats and integers. The integers are being recognized
correctly but the floats are stopping at the second character with an
exception.
Why will this grammar not recognize "2.52e+8" or "7E5"?
Stephen
--------------------
Package CPP;
Helpers
blank = ' ';
// char = [['a'..'z']+['A'..'Z']];
digit = ['0'..'9'];
eol = 10 | 13;
hexidecimal_digit= ['a'..'f'] | ['A'..'F'] | ['0'..'9'];
non_zero_digit = ['1'..'9'];
octal_digit = ['0'..'7'];
sign = '+' | '-';
Tokens
// ******************************
// Characters
// ******************************
tk_blank = 9 | 10 | 13 | blank;
tk_float_suffix = 'f' | 'F';
tk_long_suffix = 'l' | 'L';
tk_exponent = 'e' | 'E';
tk_sign = sign;
// Basic numbers
tk_decimal_literal = non_zero_digit digit*;
tk_digit = digit;
tk_digit_sequence = digit+;
tk_hexidecimal_literal = ( '0x' | '0X' ) hexidecimal_digit*;
tk_octal_literal = '0' octal_digit*;
tk_unsigned_suffix = 'u' | 'U';
// Basic characters
tk_left_paren = '(';
tk_period = '.';
tk_right_paren = ')';
Ignored Tokens
tk_blank;
Productions
// literal ::= integer-literal |
// character-literal |
// floating-literal |
// string-literal |
// boolean-literal |
// null-literal // __null
literal =
{float} floating_literal |
{int} integer_literal;
//string_literal |
//boolean_literal |
//null_literal;
// Floating point numbers
floating_literal =
{frac} fractional_constant
exponent_part?
float_suffix? |
{seq} tk_digit+
exponent_part
float_suffix?;
fractional_constant =
{fraction} [num]:tk_digit_sequence? tk_period
[exp]:tk_digit_sequence |
{whole} tk_digit_sequence tk_period;
float_suffix = {f_char} tk_float_suffix |
{l_char} tk_long_suffix;
exponent_part = tk_exponent tk_sign? tk_digit_sequence;
// Integer numbers
integer_literal =
{dec} tk_decimal_literal integer_suffix? |
{oct} tk_octal_literal integer_suffix? |
{hex} tk_hexidecimal_literal integer_suffix?;
integer_suffix =
{ul} tk_unsigned_suffix tk_long_suffix? |
{lu} tk_long_suffix tk_unsigned_suffix?;
_______________________________________________
SableCC-user mailing list
SableCC-user@xxxxxxxxxxx
http://sablecc.org/lists/control/listinfo/sablecc-user