#include<stdio.h>
int main()
{
int a,b;
a=a+b;
printf("%d",a);
return 0;
}
lo que debería ser la salida si este código se pasa a través de un analizador léxico¿cuál debería ser la salida de un lexer en c?
#include<stdio.h>
int main()
{
int a,b;
a=a+b;
printf("%d",a);
return 0;
}
lo que debería ser la salida si este código se pasa a través de un analizador léxico¿cuál debería ser la salida de un lexer en c?
el lexer simplemente tokenizes la secuencia para convertir una secuencia de caracteres en una secuencia de tokens (que se analizarán con un analizador más adelante para obtener un árbol de sintaxis completo). Para su ejemplo, usted podría obtener algo como:
#include <stdio.h> (this is handled by preprocessor, not by lexer so it wouldn't exist)
int KEYWORD
main IDENTIFIER
(LPAR
) RPAR
{ LBRACE
int KEYWORD
a IDENT
, COMMA
b IDENT
; SEMICOL
a IDENT
= ASSIGN
a IDENT
+ PLUS
b IDENT
; SEMICOL
printf IDENT
(LPAR
"%d" STRING
, COMMA
a IDENT
) RPAR
; SEMICOL
return RETURN_KEYWORD
0 INTEGER
; SEMICOL
} RBRACE
Por supuesto, un analizador léxico por sí sola no puede hacer mucho, sólo se puede dividir la fuente en elementos más pequeños posibles, la comprobación de errores de sintaxis (como palabras clave mal escritas). Necesitará algo que los combine para darles un significado semántico.
Sólo una nota: algunos lexers como para agrupar tipos similares de fichas en una sola (por ejemplo, una muestra KEYWORD
que contiene todas las palabras clave) usando un parámetro asociado a él, mientras que otros tienen un símbolo diferente para cada uno como RETURN_KEYWORK
, IF_KEYWORD
y así sucesivamente ..
¿no saca el preprocesador todo el #include
No estoy seguro acerca de los compiladores C, si realmente lo alinean y lo lex nuevamente o simplemente usa los includes para saber lo que debe definirse (sin realmente relexionar el encabezado completo), especialmente para el estándar definido (en __ < > __) ones .. – Jack
Hay un error ortográfico en la respuesta, debe ser 'RETURN_KEYWORD', pero no puedo editar la respuesta, porque necesito al menos cambiar 6 caracteres. – ollydbg23
directivas del preprocesador no estarán presentes en la entrada al compilador como el preprocesador los consumirá. Entonces, #include<stdio.h>
será reemplazado por el contenido del archivo stdio.h
.
El archivo resultante será degradada en tokens
por el scanner
de acuerdo con el lexical rules
que se puede encontrar here y se pasará a la parser
como y cuando pedir fichas.
lo que sea más conveniente para que su analizador consuma. –