Que peut créer une erreur lexicale en C?

En plus de ne pas fermer un commentaire /*... , qu’est-ce qui constitue une erreur lexicale en C?

Voilà quelque:

  "abc 

où EOF est la fin du fichier. En fait, EOF au milieu de nombreux lexèmes devrait produire des erreurs:

  0x 

Je suppose que l’utilisation de mauvaises échappements dans des chaînes est illégale:

  "ab\qcd" 

Probablement des problèmes avec les exposants à virgule flottante

  1e+% 

On peut soutenir que vous ne devriez pas avoir de choses à la fin d’une directive de préprocesseur:

 #if x % 

Fondamentalement, tout ce qui n’est pas conforme à la norme ISO C 9899/1999, Annexe A.1 “Grammaire lexicale” est une faute lexicale si le compilateur effectue son parsing lexicale conformément à cette grammaire. Voici quelques exemples:

 "abc // invalid ssortingng literal (from Ira Baxter's answer) (ISO C 9899/1999 6.4.4.5) 'a // invalid char literal (6.4.4.4) 

où EOF est la fin du fichier.

 double a = 1e*3; // misguided floating point literal (6.4.4.2) int a = 0x0g; // invalid integer hex literal (6.4.4.1) int a = 09; // invalid octal literal (6.4.4.1) char a = 'aa'; // too long char literal (from Joel's answer, 6.4.4.4) double a = 0x1p1q; // invalid hexadecimal floating point constant (6.4.4.2) // instead of q, only a float suffix, that is 'f', 'l', 'F' or 'L' is allowed. // invalid header name (6.4.7) #include < #include ""ah" 

[@ $ `] Et d’autres symboles comme celui-ci (peut-être de l’unicode) ne contiennent-ils pas d’erreurs lexicales en C si elles sont placées en dehors de la chaîne ou du commentaire? Ils ne constituent aucune séquence lexicale valide de cette langue. Ils ne peuvent pas transmettre le lexer, car le lexer ne peut les reconnaître comme un type de jeton valide. Habituellement, les lexers sont basés sur FSM ou regex, de sorte que ces symboles ne sont que des entrées non reconnues.

Par exemple, dans le code suivant, il y a plusieurs erreurs lexicales:

 int main(void){ ` int a = 3; @ — return 0; } 

Nous pouvons le soutenir en transmettant ceci à gcc, ce qui donne

 ../ac: In function 'main': ../ac:2: error: stray '`' in program ../ac:3: error: stray '@' in program ../ac:3: error: stray '\342' in program ../ac:3: error: stray '\200' in program ../ac:3: error: stray '\224' in program 

GCC est intelligent et récupère les erreurs, il a donc analysé la définition d’une fonction (il sait que nous sums en mode “principal”), mais ces erreurs ressemblent vraiment à des erreurs lexicales, ce ne sont pas des erreurs de syntaxe et à juste titre. Le lexer de GCC ne contient aucun type de jeton pouvant être construit à partir de ces symboles. Notez qu’il traite même un symbole UTF-8 à trois octets comme trois symboles non reconnus.

Identifiant illégal

 int 3d = 1; 

Directive de préprocesseur illégale

 #define x 1 

Jeton inattendu

 if [0] {} 

Identifiant insoluble

 while (0) {} 

Erreurs lexicales:

  1. Un commentaire non terminé
  2. Toute séquence de caractères sans commentaire ni espace, qui n’est pas un jeton de préprocesseur valide
  3. Tout jeton de préprocesseur qui n’est pas un jeton C valide; Un exemple est 0xe-2 , qui ressemble à une expression mais est en fait une erreur de syntaxe selon la norme – un cas de coin impair résultant des règles pour les jetons pp.

Constante de flottement mal formée (par exemple, 123.34e ou 123.45.33 ).