#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?
#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?
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.
nicht der Pre-Prozessor die gesamte #include
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
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
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.
was auch immer es am bequemsten ist für Ihren Parser zu konsumieren. –