Estoy tratando de entender la compilación y la interpretación, paso a paso, descubriendo una imagen total. Entonces hice una pregunta mientras leía http://www.cs.man.ac.uk/~pjj/farrell/comp3.html este artículo
Dice :
La siguiente etapa del compilador se llama Analizador. Esta parte del compilador comprende la gramática del lenguaje. Es responsable de identificar los errores de sintaxis y de traducir un programa sin errores en estructuras de datos internas que se puedan interpretar o escribir en otro idioma.
Pero no pude entender cómo el tokenizador puede tokenizar correctamente la secuencia dada que tiene el error de sintaxis.
Debería estar atascado allí o proporcionar información incorrecta al analizador. Quiero decir, ¿no es la tokenización también una especie de traductor?
Entonces, ¿cómo acaba de superar las líneas de código léxicas corruptas mientras se tokeniza?
Hay un ejemplo de token dentro del enlace anterior en el encabezado The Tokenizer .
Según tengo entendido, la forma del token parece, si hay algo mal en el token de código también estaría dañado.
¿Podría por favor aclarar mi malentendido?
and
o&&
algo o de lo contrario. Es (principalmente) separado y diferente del análisis. La optimización (si la hay) es un efecto secundario casi accidental.Por lo general, esperaría que la mayoría de los errores de sintaxis provengan del analizador, no del lexer.
El lexer generaría un error si (y principalmente solo si) hay algo en la entrada que no puede ser tokenizado. Sin embargo, en muchos idiomas, casi cualquier secuencia de caracteres se puede convertir en fichas de algún tipo, por lo que los errores aquí son bastante inusuales.
El analizador generará un error si la entrada contiene tokens válidos, pero esos tokens no están organizados, por lo que forman declaraciones / expresiones válidas en el idioma de destino. Esto es mucho más común como regla.
fuente
Tokenizer solo divide la secuencia de personajes en tokens. Desde el tokenizer POV esto es completamente válido:
y se traduce en algo como:
["1", MULTIPLY, MULTIPLY, "1"]
solo el analizador puede rechazar tales expresiones; sabe que el operador de multiplicación no puede seguir a otro operador de multiplicación. Por ejemplo, en JavaScript, esto produce:Hay errores que pueden ser detectados por el tokenizer. Por ejemplo literales de cadena: sin terminar
"abc
o números no válidos:0x0abcdefg
. Sin embargo, aún podrían informarse como errores de sintaxis:Sin embargo, tenga en cuenta que el token no se reconoció y se informa como
ILLEGAL
.fuente