2015-11-20 2 views
3

Considérons la ligne numéro 3 du programme-C suivant.Erreur lexicale par rapport à l'erreur de syntaxe dans C

int main() {   /*Line 1 */ 
int I, N;    /*Line 2 */ 
fro (I=0, I<N, I++); /*Line 3 */ 
} 

Identifier la réponse du compilateur de cette ligne lors de la création du module d'objet:

  1. Aucune erreur de compilation
  2. Seule une erreur lexicale
  3. Seules les erreurs syntaxiques
  4. deux lexical et syntaxique erreurs

Ma tentative:

Line 3 a fro au lieu de for mot-clé de C. Depuis, analyseur lexical ne se soucie pas mauvais mot clé, ce travail d'analyse de syntaxe pour assurer une syntaxe correcte ou un mot clé (à savoir for() au lieu de fro()). L'analyseur lexical fait la tokenisation du programme.

Can you explain in formal way please?

Répondre

5

fro ne correspond pas à un mot-clé, mais le lexing ira OK et fro seront classés comme identifiant.

Lors de l'étape d'analyse, fro (I=0, I<N, I++) sera transformé en un appel de fonction avec trois arguments. Notez que la modification et la lecture de la variable I dans le même point de séquence est un comportement indéfini. Au cours de l'analyse de l'étendue, le compilateur se plaindra qu'aucune telle fonction n'existe ou, dans le cas où le compilateur traite des fonctions invisibles comme déclarées implicitement, l'éditeur de liens se plaindra qu'il existe une référence indéfinie à une fonction.

+0

Le compilateur avertira certainement que 'fro' est non déclaré cependant. – fuz

+0

@Blagovest, oui il donne une erreur [error] (http://cpp.sh/9hrlp): '' fro 'n'a pas été déclaré dans cette portée'. Est-ce une erreur de syntaxe ou une erreur sémantique? –

+0

@MithleshUpadhyay: c'est vraiment une erreur sémantique. Bien que ce soit un programme invalide, il est conforme à la syntaxe du langage. –