[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Getting verbose output from the parser
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?;