0
   DECIMAL_LITERAL : ('0' | '1'..'9' ('0'..'9')*) (INTEGER_TYPE_SUFFIX)? ;

   FLOATING_POINT_LITERAL

   :   ('0'..'9')+ 

       (
           DOT ('0'..'9')* (EXPONENT)? (FLOAT_TYPE_SUFFIX)?
       |   EXPONENT (FLOAT_TYPE_SUFFIX)?
       |   FLOAT_TYPE_SUFFIX
       )
       |   DOT ('0'..'9')+ (EXPONENT)? (FLOAT_TYPE_SUFFIX)?
   ;

DECIMAL_LITERALはc言語のintリテラルに一致し、FLOATING_POINT_LITERALはc言語のfloatリテラルに一致します。ただし、レクサーが3.44などのfloatに一致すると、3はルールDECIMAL_LITERALに一致します。

floatリテラルを認識させるにはどうすればよいですか?

4

1 に答える 1

0

ルールを 1 つのレクサー ルールに結合してから、 が表示されるかどうかに基づいてタイプを変更しますDOT。上で書いたものとまったく同じではありませんが、これでアイデアが得られるはずです。

DECIMAL_LITERAL 
:   ('0'..'9')+ 
   (
       DOT { _ttype = FLOATING_POINT_LITERAL; } ('0'..'9')* (EXPONENT)? (FLOAT_TYPE_SUFFIX)?
   |   EXPONENT (FLOAT_TYPE_SUFFIX)?
   |   FLOAT_TYPE_SUFFIX
   )
   |   DOT { _ttype = FLOATING_POINT_LITERAL; } ('0'..'9')+ (EXPONENT)? (FLOAT_TYPE_SUFFIX)?
;

より完全な例については、http://www.antlr3.org/grammar/cgram/ にある私の C 文法を参照してください。

于 2013-02-08T19:27:02.760 に答える