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