Was kann erstellen Sie einen lexikalischen Fehler in C?
Neben der nicht schließen Sie einen Kommentar /*...
, was unter einem lexikalischen Fehler in C?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Neben der nicht schließen Sie einen Kommentar /*...
, was unter einem lexikalischen Fehler in C?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier sind einige:
wo EOF am Ende der Datei. In der Tat, ein EOF-Zeichen in der Mitte viele Lexeme sollten Fehler produzieren:
Ich gehe davon aus, dass die Verwendung von bad-escapes bei Zeichenketten ist illegal:
Wohl Probleme mit floating-point-Exponenten
Wohl, sollten Sie nicht haben, Sachen, die am Ende einer Präprozessor-Direktive:
"abc<EOL>
eine lexikalische Fehler? (end-of-line anstelle von end-of-file)yacc
Regel, um diese zu überprüfen syntaktischQUOTE LETTERS QUOTE
oder einelex
regexp um die Arbeit zu tun\"[a-z]*\"
(vereinfachte version, natürlich). Nun, das ist eine lex oder ein syntax-Fehler, hängt von der Umsetzung? Oder es ist das Standard, wir alle Zustimmen können?"abc\<EOL>def"
(Zeilenumbruch mit einem backslash). Gut, danke für die Diskussion.Grunde alles, was nicht konform zu den ISO-C-9899/1999, Anhang A. 1 "Lexikalische Grammatik" ist eine lexikalische Fehler, wenn der compiler keine lexikalischen Analyse nach dieser Grammatik. Hier sind einige Beispiele:
wo EOF am Ende der Datei.
0[0-7]*
ich denke, es ist.0xe-2
die einen syntax-Fehler eher als ein Ausdruck mit dem Wert von 12.0x
ist keine gültige hex-Konstanten, aberM(0xe,2)
wirklich legal, während0xe-2
ist nicht.Nicht [@$`] und die anderen Symbole wie (vielleicht unicode) lexikalische Fehler in C, wenn man überall außerhalb von string oder Kommentar? Sie sind nicht die beliebige gültige lexikalische Reihenfolge, die Sprache. Sie können nicht übergeben, die lexer da der lexer kann nicht erkennen, dass Sie jede Art von gültigen token. In der Regel lexers sind FSM-oder regex-basiert, so sind diese Symbole nur unrecognized input.
Zum Beispiel in dem folgenden code gibt es mehrere lexikalische Fehler:
Unterstützen wir Sie durch die Fütterung dieses gcc, die gibt
GCC ist smart und macht Fehler-recovery, damit es analysiert die definition einer Funktion (er weiß, wir sind im 'main') aber diese Fehler definitiv Aussehen lexikalischen Fehler, Sie sind nicht Fehler in der syntax und das zu Recht. GCC lexer nicht alle Arten von Token, die gebaut werden können, die aus diesen Symbolen. Beachten Sie, dass es auch behandelt einen drei-byte UTF-8-Zeichen als drei unbekannte Symbole.
Illegale id
Illegale Präprozessor-Direktive
Unerwartetes token
Regional-id
Lexikalische Fehler:
0xe-2
, die aussieht wie ein Ausdruck, sondern ist in der Tat ein syntax-Fehler gemäß der Norm -- eine sonderbare Ecke Fall, die aus den Regeln für die pp-Token.Schlecht gebildet float-Konstante (z.B.
123.34e
oder123.45.33
).