2010-07-10 5 views
2

Je lis le livre du dragon. Citant le texte du livre (3.1.4 erreurs lexicales, 114) PnoQuestion sur l'analyse lexicale

Il est difficile pour un analyseur lexical tell, sans l'aide d'autres composants , qu'il ya une erreur de code source . Par exemple, si la chaîne fi est rencontré pour la première fois dans un programme C dans le contexte:

fi (a == f(x)) ... 

un analyseur lexical ne peut pas dire si fi est une faute d'orthographe du mot-clé if ou non déclaré fonction identificateur. Depuis fi est un lexème valide pour l'ID de jeton, l'analyseur lexical doit retourner le jeton id à l'analyseur et laisser une autre phase de le compilateur - probablement l'analyseur en ce cas - gérer une erreur due à transposition des lettres.

Je suis un peu confus après avoir lu ceci. D'après ce que je comprends, l'analyseur lexical commence à traiter le texte de gauche à droite et renvoie les jetons chaque fois que le motif correspond. Donc pour une langue où if est le mot-clé pour correspondre, comment fi peut-il correspondre?

Des pensées?

Répondre

7

Il ne correspond pas au jeton if, mais au jeton id, qui correspond à «identificateur». C'est le fourre-tout si aucun mot-clé ne correspond. L'analyseur lexical ne sait pas quoi «attendre» à certaines positions. Il retourne juste des jetons, et l'analyseur saura ce qu'il attend. Un analyseur C doit accepter la déclaration suivante, par exemple, qui est un appel de fonction

fi (a == f(x)); 
+0

Ahh ... c'est logique maintenant. Merci –

1

Comment voulez-vous dire si if était la seule entrée attendue à un moment donné?

int a = 42; 
if (a == 42) 
    puts("ok"); 

contre

int a = 42; 
fi (a == 42) 
    puts("ok"); 

fi pourrait être un appel de fonction. Par exemple, le ci-dessus pourrait être une mauvaise orthographe:

int a = 42; 
fi(a == 42); 
puts("ok"); 

fi est une fonction qui prend int et retour void.

1

Ceci est un mauvais choix d'exemple pour une explication d'erreur d'analyse lexicale. Ce que ce texte essaie de vous dire, c'est que le compilateur ne peut pas reconnaître que vous avez mal orthographié le mot-clé "if" (écrit à l'envers). Il voit juste "fi" qui est par exemple un nom de variable valide et renvoie donc l'id (par exemple) "VARIABLE" à l'analyseur. L'analyseur puis réalise plus tard l'erreur de syntaxe.

Cela n'a rien à voir avec aller de gauche à droite ou de droite à gauche. Le compilateur lit bien sûr le code source de gauche à droite. Comme je l'ai dit - un mauvais choix de mot-clé pour cette explication.

2

Vous devez faire une distinction entre l'analyse syntaxique et l'analyse lexicale.

  • La tâche de l'analyse lexicale est de convertir une séquence de caractères en une chaîne de jetons. Il peut y avoir différents types de jetons, ex IDENTIFIER, OPÉRATEUR D'ADDITION, OPÉRATEUR DE FIN DE DÉCLARATION, etc. L'analyse lexicale ne peut échouer avec une erreur que si elle rencontre une chaîne de texte qui ne correspond à aucun jeton. Dans votre cas fi (a == f(x)) ... se traduirait par <IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <EQUALITY> <IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <RIGHT BRACKET> <RIGHT BRACKET> .....

  • Une fois qu'une chaîne de jetons a été générée, l'analyse syntaxique est effectuée. Cela implique généralement la construction d'une sorte d'arbre de syntaxe à partir des jetons. L'analyseur est conscient de toutes les formes d'instructions valides qui sont autorisées dans la langue. Si l'analyseur ne trouve pas de règle de syntaxe autorisant la séquence de jetons ci-dessus, elle échouera.

+0

Merci. C'est clair maintenant. –