2010-04-18 17 views
5
#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?

+7

lo que sea más conveniente para que su analizador consuma. –

Respuesta

11

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 ..

+0

¿no saca el preprocesador todo el #include , y esencialmente en línea el contenido de cualquier archivo que esté incluido? – JustJeff

+0

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

+0

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

3

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.

Cuestiones relacionadas