2010-04-18 12 views
5
#include<stdio.h> 

int main() 
{ 
    int a,b; 
    a=a+b; 
    printf("%d",a); 
return 0; 
} 

quello che dovrebbe essere l'uscita se questo codice viene fatta passare attraverso un lexerquale dovrebbe essere l'output di un lexer in c?

+7

qualunque sia il più conveniente per il parser da consumare. –

risposta

11

il lexer esegue semplicemente token del flusso per trasformare un flusso di caratteri in un flusso di token (che verrà analizzato successivamente con un parser per ottenere un albero di sintassi completo). Per il vostro esempio, si otterrebbe qualcosa come:

#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 

Naturalmente un lexer di per sé non può fare molto, si può semplicemente dividere il sorgente in piccoli elementi possibili, il controllo per errori di sintassi (come parole chiave con errori di ortografia). Avrai bisogno di qualcosa che li unisca per dar loro un significato semantico.

Solo una nota a margine: alcune lexer come per raggruppare tipologie simili di gettoni in una sola (ad esempio un token KEYWORD che contiene tutte le parole chiave) utilizzando un parametro associato ad esso, mentre altri hanno un segno diverso per ogni uno come RETURN_KEYWORK , IF_KEYWORD e così via ..

+0

non utilizza il pre-processore per l'intero #include e essenzialmente in-line il contenuto di qualsiasi file incluso? – JustJeff

+0

Non sono sicuro dei compilatori C, se li allineano e li rilegge di nuovo o semplicemente usano gli include per sapere cosa dovrebbe essere definito (senza effettivamente relexing l'intera intestazione), specialmente per lo standard definito (in __< > __) ones .. – Jack

+0

C'è un errore di battitura nella risposta, dovrebbe essere 'RETURN_KEYWORD', ma non posso modificare la risposta, perché ho bisogno di almeno modificare 6 caratteri. – ollydbg23

3

direttive del preprocessore non saranno presenti in ingresso al compilatore come il preprocessore li consumerà. Quindi #include<stdio.h> verrà sostituito dal contenuto del file stdio.h.

Il file risultante sarà suddiviso in tokens dal scanner secondo il lexical rules che può essere trovato here e sarà passato al parser come e quando è chiedere gettoni.

Problemi correlati