2010-03-23 10 views
8

¿Cuál es la diferencia entre esta gramática:antlr gramática: parser- y analizadoras literales

... 
if_statement : 'if' condition 'then' statement 'else' statement 'end_if'; 
... 

y esto:

... 
if_statement : IF condition THEN statement ELSE statement END_IF; 
... 

IF : 'if'; 
THEN: 'then'; 
ELSE: 'else'; 
END_IF: 'end_if'; 
.... 

?

Si hay alguna diferencia, ya que esto repercute en el rendimiento ... Gracias

Respuesta

1

La única diferencia es que en su primera regla de producción, las fichas de palabras clave se definen implícitamente. No hay implicación de rendimiento en tiempo de ejecución para los tokens definidos implícitamente frente a explícitamente.

8

Además de la respuesta de Will, es mejor definir sus tokens lexer explícitamente (en su gramática más lex). En caso de que los estés mezclando en tu gramática de analizador, no siempre está claro en qué orden los tokens son tokenizados por el lexer. Al definirlos de forma explícita, siempre se los tokenizan en el orden en que se colocaron en la gramática del lexer (de arriba a abajo).

2

La mayor diferencia es una que quizás no le importe. Si sus reglas de Lexer están en el Lexer, puede usar la herencia para que varios Lexer compartan un conjunto común de reglas léxicas.

Si solo usa cadenas en las reglas de su analizador, entonces no puede hacer esto. Si nunca planea reutilizar su gramática más lexer, entonces esta ventaja no importa.

Además, y supongo que la mayoría de los veteranos Antlr, están más acostumbrados a encontrar las reglas más claras en la gramática real en lugar de mezclarlas con la gramática del analizador, por lo que podría argumentarse que la legibilidad aumenta al poner las reglas en el Lexer.

No hay impacto en el rendimiento del tiempo de ejecución después de que el analizador Antlr se haya creado para cualquiera de los dos enfoques.

0

Sin embargo, otra diferencia: cuando define explícitamente sus reglas lexer puede acceder a ellas mediante el nombre que le dio (por ejemplo, cuando necesita verificar un tipo de token específico). De lo contrario, ANTLR usará números arbitrarios (con un prefijo).

Cuestiones relacionadas