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

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

was die Ausgabe sein sollte, wenn dieser Code durch einen Lexer übergeben wirdWas sollte die Ausgabe eines Lexers in c sein?

+7

was auch immer es am bequemsten ist für Ihren Parser zu konsumieren. –

Antwort

11

Der Lexer tokenisiert nur den Stream, um einen Strom von Zeichen in einen Strom von Token umzuwandeln (der später mit einem Parser analysiert wird, um einen vollständigen Syntaxbaum zu erhalten).

#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 

Natürlich ein Lexer selbst nicht viel tun, es kann aufgespalten nur die Quelle in kleinste Elemente möglich, auf Syntaxfehler überprüft (wie falsch geschriebene Schlüsselwörter): Für Ihr Beispiel würden Sie so etwas wie erhalten. Sie werden etwas brauchen, das sie kombiniert, um ihnen eine semantische Bedeutung zu geben.

nur eine Randnotiz: einige lexers wie gruppieren ähnliche Arten von Tokens in nur einem (zum Beispiel ein KEYWORD Token, das alle Schlüsselwörter enthält) mit einem Parameter, der mit ihm verbunden, während andere einen anderen Token für jeden wie RETURN_KEYWORK haben , IF_KEYWORD und so weiter.

+0

nicht der Pre-Prozessor die gesamte #include herausnehmen, und im Wesentlichen in-line den Inhalt der Datei enthalten ist? – JustJeff

+0

Ich bin nicht sicher über C-Compiler, wenn sie es wirklich inline und lex es wieder oder einfach verwendet die Includes zu wissen, was es definiert werden sollte (ohne tatsächlich den gesamten Header), speziell für Standard definiert (in __ < > __) one .. – Jack

+0

Es gibt einen Tippfehler in der Antwort, es sollte "RETURN_KEYWORD" sein, aber ich kann die Antwort nicht bearbeiten, weil ich mindestens 6 Zeichen ändern muss. – ollydbg23

3

Präprozessordirektiven wird nicht an den Compiler im Eingang vorhanden sein, da der Präprozessor sie verbrauchen. So wird #include<stdio.h> durch den Inhalt der Datei stdio.h ersetzt.

Die resultierende Datei wird nach unten in tokens vom scanner nach den lexical rules gebrochen werden, die here gefunden werden kann und wird auf die parser wie und wann es für Token fragt übergeben werden.