¿Hay alguna manera de mejorar esta gramática ANTLR 3 para números enteros y decimales positivos y negativos?

¿Hay alguna manera de expresar esto de una manera menos repetitiva con los signos opcionales positivos y negativos?

Lo que estoy tratando de lograr es cómo expresar opcionalmente proporcionar información positiva. + (predeterminado) y negativo - signos en literales numéricos que opcionalmente tienen exponentes yo partes decimales.

NUMBER : ('+'|'-')? DIGIT+ '.' DIGIT* EXPONENT?
       | ('+'|'-')? '.'? DIGIT+ EXPONENT?
       ;

fragment 
EXPONENT : ('e' | 'E') ('+' | '-') ? DIGIT+ 
         ;

fragment
DIGIT  : '0'..'9' 
       ;

Quiero poder reconocer NUMBER patrones, y no estoy tan preocupado por la aritmética en esos números en ese momento, lo haré más tarde, pero estoy tratando de entender cómo reconocer cualquier NUMBER literales donde los números se parecen a:

123
+123
-123
0.123
+.123
-.123
123.456
+123.456
-123.456
123.456e789
+123.456e789
-123.456e789 

y cualquier otro formato estándar que no haya pensado incluir aquí.

preguntado el 16 de mayo de 11 a las 18:05

1 Respuestas

Para responder a su pregunta: no, no hay forma de mejorar este AFAIK. Podrías colocar ('+' | '-') dentro de una regla de fragmento y usar ese fragmento, al igual que el fragmento de exponente, pero no lo llamaría una mejora real.

Tenga en cuenta que unario + y - los signos generalmente no forman parte de una ficha numérica. Considere la fuente de entrada "1-2". No quieres que se tokenice como 2 números: NUMBER[1] y NUMBER[-2], Sino como NUMBER[1], MINUS[-] y NUMBER[2] para que su analizador contenga lo siguiente:

parse
  :  statement+ EOF
  ;

statement
  :  assignment
  ;

assignment
  :  IDENTIFIER '=' expression
  ;

expression
  :  addition
  ;

addition
  :  multiplication (('+' | '-') multiplication)*
  ;

multiplication
  :  unary (('*' | '/') unary)*
  ;

unary
  :  '-' atom
  |  '+' atom
  |  atom
  ;

atom
  :  NUMBER
  |  IDENTIFIER
  |  '(' expression ')'
  ;

IDENTIFIER
  :  ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | DIGIT)*
  ;

NUMBER 
  :  DIGIT+ '.' DIGIT* EXPONENT?
  |  '.'? DIGIT+ EXPONENT?
  ;

fragment 
EXPONENT 
  :  ('e' | 'E') ('+' | '-') ? DIGIT+ 
  ;

fragment
DIGIT  
  :  '0'..'9' 
  ;

y addition por lo tanto, coincidirá con la entrada "1-2".

EDITAR

Una expresión como 111.222 + -456 se analizará de la siguiente manera:

enter image description here

y +123 + -456 como:

enter image description here

contestado el 17 de mayo de 11 a las 00:05

@ Jarrod, pero ¿cómo analizarás 1--2? Mi sugerencia maneja esto correctamente. - Bart Kiers

... y - 3 (menos el número de espacio)? - Bart Kiers

¿Qué significa la definición de NUMBER en su ejemplo, no entiendo cómo funciona sin ese ejemplo. - usuario177800

@ Jarrod, sí, eso fue un poco confuso. Agregué las reglas de lexer a mi ejemplo. - Bart Kiers

@ Jarrod, agregué algunas reglas a mi gramática de ejemplo. - Bart Kiers

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.