Opération de l'analyseur syntaxique générée par la commande yacc
La commande yacc convertit le fichier de grammaire en programme en langage C.
Ce programme, lorsqu'il est compilé et exécuté, analyse l'entrée en fonction de la spécification grammaticale fournie.
L'analyseur est une machine à états finis avec une pile. L'analyseur syntaxique peut lire et mémoriser le jeton d'anticipation. L'état en cours est toujours l'état en haut de la pile. Les états de la machine à états finis sont représentés par de petits entiers. Au départ, la machine est à l'état 0, la pile ne contient que 0 et aucun jeton d'anticipation n'a été lu.
| Opération | Descriptif |
|---|---|
| shift Etat | L'analyseur syntaxique insère l'état en cours dans la pile, fait de l'état Etat l'état en cours et efface le jeton d'anticipation. |
| réduire Règle | Lorsque l'analyseur trouve une chaîne définie par Règle (un numéro de règle) dans le flux d'entrée, il remplace cette chaîne par Règle dans le flux de sortie. |
| accepter | L'analyseur syntaxique examine toutes les entrées, les met en correspondance avec la spécification grammaticale et reconnaît l'entrée comme satisfaisant à la structure de niveau le plus élevé (définie par le symbole de début). Cette action apparaît uniquement lorsque le jeton de recherche anticipée est le marqueur de fin et indique que l'analyseur syntaxique a effectué son travail avec succès. |
| Erreur | L'analyseur syntaxique ne peut pas continuer à traiter le flux d'entrée et le faire correspondre avec les règles définies dans la spécification grammaticale. Les jetons d'entrée examinés par l'analyseur syntaxique, ainsi que le jeton d'entrée anticipée, ne peuvent pas être suivis de quoi que ce soit qui donnerait lieu à une entrée valide. L'analyseur syntaxique signale une erreur et tente de récupérer la situation et de reprendre l'analyse syntaxique. |
L'analyseur syntaxique effectue les actions suivantes au cours d'une étape de processus:
- En fonction de son état actuel, l'analyseur syntaxique décide s'il a besoin d'un jeton d'anticipation pour déterminer l'action à effectuer. Si l'analyseur syntaxique a besoin d'un jeton d'anticipation et n'en a pas, il appelle la sous-routine yylex pour obtenir le jeton suivant.
- A l'aide de l'état en cours et du jeton de recherche anticipée, si nécessaire, l'analyseur syntaxique décide de son action suivante et l'exécute. Par conséquent, les états peuvent être insérés dans la pile ou en sortir, et le jeton d'anticipation peut être traité ou laissé seul.
Action Maj
IF shift 34- Envoie l'état en cours vers le bas sur la pile.
- Rend l'état34l'état courant (le place en haut de la pile).
- Efface le jeton d'anticipation.
Action Réduire
L'action reduce permet d'éviter que la pile ne soit trop volumineuse. L'analyseur syntaxique utilise des actions de réduction après la mise en correspondance du côté droit d'une règle avec le flux d'entrée. L'analyseur syntaxique est alors prêt à remplacer les caractères du flux d'entrée par le côté gauche de la règle. L'analyseur peut être amené à utiliser le jeton de recherche anticipée pour déterminer si le modèle est une correspondance complète.
. reduce 18IF shift 34A : x y z ;Le nombre d'états est égal au nombre de symboles à droite de la règle. Ces états sont ceux mis sur la pile lors de la reconnaissancex,yetz. Après l'apparition de ces états, un état est découvert, c'est-à-dire l'état dans lequel l'analyseur syntaxique se trouvait avant de commencer à traiter la règle, c'est-à-dire l'état qui devait reconnaître la règleApour satisfaire à sa règle. A l'aide de cet état non couvert et du symbole sur le côté gauche de la règle, l'analyseur syntaxique effectue une action appelée goto, qui est similaire à un décalage deA. Un nouvel état est obtenu, inséré dans la pile et l'analyse se poursuit.
A goto 20Cette entrée provoque l'état20à pousser sur la pile et à devenir l'état courant.
L'action de réduction est également importante dans le traitement des actions et des valeurs fournies par l'utilisateur. Lorsqu'une règle est réduite, l'analyseur syntaxique exécute le code que vous avez inclus dans la règle avant d'ajuster la pile. Une autre pile s'exécutant en parallèle avec la pile contenant les états contient les valeurs renvoyées par l'analyseur lexical et les actions. Lorsqu'une période de travail est effectuée, la variable externe yylval est copiée sur la pile contenant les valeurs. Après l'exécution du code que vous fournissez, l'analyseur syntaxique effectue la réduction. Lorsque l'analyseur effectue l'action goto , il copie la variable externe yylval dans la pile de valeurs. Les mots clés yacc qui commencent par$faire référence à la pile de valeurs.