2011-08-18 26 views
5

Cuando nos fijamos en la descripción EBNF de una lengua, a menudo se ve una definición para los números enteros y números reales:¿El reconocimiento de números pertenece al escáner o al analizador?

integer ::= digit digit* // Accepts numbers with a 0 prefix 
real  ::= integer "." integer (('e'|'E') integer)? 

(Definiciones fueron hechas sobre la marcha, probablemente he cometido un error en ellos).

Aunque aparecen en la gramática sin contexto, los números a menudo se reconocen en la fase de análisis léxico. ¿Están incluidos en la definición del lenguaje para hacerlo más completo y corresponde al implementador darse cuenta de que realmente deberían estar en el escáner?

Respuesta

3

Muchas herramientas de generador de analizadores comunes, como ANTLR, Lex/YACC, analizan por separado en dos fases: primero, la cadena de entrada se tokeniza. En segundo lugar, los tokens se combinan en producciones para crear un árbol de sintaxis concreto.

Sin embargo, hay técnicas alternativas que no requieren tokenización: echa un vistazo atrás recursive-descent parsers. Para dicho analizador, los tokens se definen de manera similar a los no tokens. pyparsing es un generador de analizadores para tales analizadores.

La ventaja de la técnica de dos pasos es que generalmente produce analizadores más eficientes: con tokens, hay mucha menos manipulación de cadenas, búsqueda de cadenas y retroceso.

De acuerdo con "The Definitive antlr Reference" (Terence Parr),

La única diferencia entre [lexers y analizadores] es que el analizador reconoce estructura gramatical en una corriente de tokens mientras que el analizador léxico reconoce estructura en una secuencia de personajes.

1

La sintaxis de la gramática debe ser completa para ser precisa, por lo que, por supuesto, incluye detalles sobre el formato preciso de los identificadores y la ortografía de los operadores.

Sí, el ingeniero compilador decide, pero en general es bastante obvio. Desea que el lexer maneje todos los detalles del nivel de personaje de manera eficiente.

Hay una respuesta más larga en Is it a Lexer's Job to Parse Numbers and Strings?

Cuestiones relacionadas