#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?
#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?
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 ..
non utilizza il pre-processore per l'intero #include
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
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
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.
qualunque sia il più conveniente per il parser da consumare. –