Méthode du principe de la compilation de haut en bas pour éliminer l'ambiguïté et la récursivité à gauche


Préface

La langue est de répondre à certaines règles de composition d'une collection de phrases, des phrases qui répondent à certaines règles de composition séquence de mots, le mot doit répondre à certaines chaînes de règles de composition . Ces règles de composition sont les productions de la grammaire.
L'analyse syntaxique est la partie centrale du compilateur. Sa tâche est de vérifier si la séquence de mots sortie par l'analyseur lexical est une phrase dans la langue source, c'est-à-dire si elle est conforme aux règles grammaticales de la langue source. Que ce soit de haut en bas ou de bas en haut, l'analyseur de grammaire scanne la séquence de mots d'entrée de gauche à droite, lit un mot à la fois et construit un arbre d'analyse grammaticale pour la séquence de mots d'entrée.

1. Méthode de haut en bas

L'idée de base de l'analyse grammaticale descendante : à
partir du symbole de début de la grammaire, recherchez une dérivation la plus à gauche de la chaîne de symboles d'entrée donnée. Autrement dit, à partir de la racine S, construisez un arbre de syntaxe de la chaîne de symboles d'entrée donnée.

Exemple: avec

G: S → x A y, A → ∗ ∗ ∣ ∗, chaîne d'entrée: x ∗ ∗ y G: S → xAy, A → ** | *, chaîne d'entrée: x ** y G Sx A y ,UNE, Saisissez la chaîne : Xy
est analysé commesuit:
S → x A y → x ∗ ∗ y S → xAy → x ** ySx A yX∗ L'
arbre de syntaxe y est:Arbre de syntaxe


2. Problèmes descendants

1. Ambiguïté

1.1 Définition de l'ambiguïté : Pour la grammaire G, s'il y a une phrase avec deux ou plusieurs arbres d'analyse dans L (G), alors G est dit ambigu. Il peut également être dit de manière équivalente: s'il y a une phrase avec deux ou plusieurs dérivations les plus à gauche (ou les plus à droite) dans L (G), alors G est une grammaire ambiguë.

1.2 Contexte du problème d'ambiguïté : en supposant que w ∈ L (G) et qu'il existe deux dérivations les plus à gauche de w, lors d'une analyse grammaticale descendante de w, le programme d'analyse grammaticale ne sera pas en mesure de déterminer laquelle de w est la plus Dérive à gauche. Alors la grammaire a un problème d'ambiguïté.

1.3 Exemple de problème bilatéral :
假 Grammaire établie G
∣: E → id ∣ c ∣ E + E ∣ E - E ∣ E ∗ E ∣ E / E ∣ E ∗ ∗ E ∣ (E) G: E → id | c | E + E | E - E | E * E | E / E | E ** E | (E)g:Ei d c E+E E - E EE E / E EE ( E )
Analysez les phrases suivantes selon la grammaire G:

id 1 + c ∗ id 2 id1 + c * id2 je d 1+ci d 2
produira deux arbres de syntaxe différents: l'
arbre de syntaxe un: l'Insérez la description de l'image des sodas iciarbre de syntaxe deux:
Insérez la description de l'image ici

2. Solutions aux problèmes d'ambiguïté

Solution 1: Grammaire modifiée, importation Nouvelle grammaire Grammaire
générale transformée G G: E → id ∣ c ∣ E + E ∣ E - E ∣ E ∗ E ∣ E / E ∣ E ∗ ∗ E ∣ (E) G: E → id | c | E + E | E - E | E * E | E / E | E ** E | (E)g:Ei d c E+E E - E EE E / E EE ( E ) se
transforme en:

 G:    E → E+T | E-T| T
		T → T*F | T/F | F
		F → F↑P | P 
		P → c | id | (E)  

Solution 2: Selon la relation de priorité, garantir le principe de priorité des opérateurs hautement prioritaires.

3. Problème de récursivité gauche

3.1 Définition de la récursivité gauche : s'il y a une dérivation A -> αAβ, alors la grammaire G est dite récursive, et quand α = ε, on l'appelle récursivité gauche.
Supplément: Si A -> αAβ nécessite au moins deux dérivations, alors la grammaire G est appelée récursivité indirecte, et lorsque α = ε, elle est appelée récursivité gauche indirecte; s'il y a une production de la forme A -> αAβ dans la grammaire G, alors La grammaire G est appelée récursivité directe, lorsque α = ε, elle est appelée récursivité gauche directe.

3.2 Le contexte du problème de récursivité gauche : Lorsque le premier symbole non terminal sur la partie droite de la production est le symbole non terminal sur la partie gauche de la production, le problème de récursivité gauche se pose.

3.3 Exemples de problèmes de récursivité gauche directe :
Exemple: problèmes de dérivation infinie causés par la récursivité gauche:

  Ger:	E→E+T   
		E→T   
		T→F   
		T→T*F    
		F→(E)   
		F→id 

Envisagez de créer une dérivation la plus à gauche pour la chaîne d'entrée id + id * id:
lorsque la dérivation la plus à gauche est établie, lorsque la dérivation atteint E ou T, une récursivité à gauche est générée, ce qui conduit à une dérivation infinie.

3.4 Exemple de
récursion gauche indirecte : un exemple de récursivité gauche indirecte:

     S → Ac | c
     A → Bb | b
     B → Sa | a

4. La solution au problème de récursivité à gauche

4.1 Solution récursive directe gauche :

Étape 1: Élimination directe de la récursivité gauche (conversion en récursivité droite)
Étape 2: Introduire une nouvelle variable A ', remplacer la production récursive gauche A → Aα | β par A → βA' A '→ αA' ​​| ε
ci-dessus L'exemple est résolu selon la solution:

Insérez la description de l'image ici
4.2 Solution récursive indirecte gauche :

L'idée de base de l'élimination de la récursivité indirecte à gauche : 1. Numérotez les variables grammaticales 2. Ensuite, utilisez la méthode du bring-in pour transformer la récursion indirecte à gauche en récursion directe à gauche 3. Ensuite, utilisez la méthode ci-dessus pour éliminer la récursion directe à gauche.
étape:

1.将G的所有语法变量排序(编号),假设排序后的语法变量记为A1,A2,…,An;
2for i←1 to n {
    
    
3for j←1 to i-1 {
    
    
4.        对每个形如Ai→Ajβ的产生式,其中,Aj→α1|α2||αk是
           所有当前Aj产生式,用产生式Ai→α1β|α2β||αkβ替换
5}
6.     消除Ai产生式中的所有直接左递归
7} 

Analyse de pseudo-code: lorsque
i = 1, le corps de la boucle des lignes 3 à 5 n'est pas exécuté. À ce stade, l'opération d'élimination de récursivité gauche sur la ligne 6 est exécutée pour éliminer la récursivité gauche directe de toutes les variables A1.
À ce moment, tout A1 a A1 → Une production sous forme de Abα doit avoir b> 1.

Si l'on regarde i = 2, l'élément le plus à gauche à droite de A2 est une variable. La forme de production peut être A2 → A1α | A2β | A3γ | ... On
sait que l'élément actuel le plus à gauche à droite de A1 est une variable. La forme de production est A1 → A2α '| A3β' | ......
Après l'opération de remplacement à la ligne 4, toutes les productions de A2 ont la forme A2 → Abα, et b> = 2 doit être trouvée.
Après avoir exécuté l'élimination de la récursivité gauche directe à la ligne 6, toutes les productions de A2 de forme A2 → Abα doivent avoir b> 2.

i = 3, l'élément le plus à gauche à droite de A3 est une variable. La forme de production peut être A3 → A1α | A2β | A3γ | ... On
sait que l'élément actuel le plus à gauche à droite de A1 est une variable. La forme de production est A1 → A2α '| A3β' | ……,
l'élément le plus à gauche à droite de l'A2 courant est une variable. Le formulaire de production est A2 → A3α '| A4β' | ……
Après l'opération de remplacement à la ligne 4, tout A3 a A3 Une production sous forme de Abα doit avoir b> = 3.
Après avoir exécuté l'élimination de la récursion gauche directe à la ligne 6, toutes les productions de A3 de forme A3Abα doivent avoir b> 3.

Par analogie, i = n, après l'opération de remplacement de la ligne 4, toutes les productions de An ont la forme An → Abα, et b> = n doit être là.
Après avoir exécuté l'élimination de la récursion gauche directe à la ligne 6, toutes les productions de An de forme An → Abα doivent avoir b> n. En d'autres termes, la récursivité gauche a été éliminée.

L'explication détaillée des étapes d'élimination pour l'exemple de récursivité indirecte gauche ci-dessus est:

     S → Ac | c
     A → Bb | b
     B → Sa | a

Ordre des variables de syntaxe: quand B, A, S
i = 1, B → Sa | a n'a pas de récursion directe vers la gauche; quand
i = 2, A → Bb | b, obtenir après avoir substitué la variable B, A → Sab | ab | b;
i = 3, S → Ac | c, remplacez la variable A pour obtenir S → Sabc | abc | bc | c;
puis effectuez l'opération d'élimination directe de récursivité gauche.

5. Problèmes de retour en arrière

5.1 définition du problème de retour en arrière : les productions grammaticales Une partie droite de chaque syntaxe référencée Une variable de type candidat . S'il y a plusieurs candidats pour A avec un préfixe commun , l'analyseur de haut en bas ne sera pas en mesure de sélectionner avec précision la production utilisée pour la dérivation en fonction des symboles d'entrée actuels, et peut uniquement tester. Lorsque l'essai échoue, vous devez revenir à l'étape précédente de la dérivation pour voir s'il existe d'autres candidats pour A. Il s'agit d'un retour en arrière.

5.2 Exemples de problèmes de retour arrière :
Il existe la grammaire G suivante:

Ge:	E→T   
    	E→E+T   
		E→E-T   
 		T→F   
 		T→T*F   
		T→T/F  
		F→(E)   
		F→id 

Envisagez d'établir la dérivation la plus à gauche pour la chaîne d'entrée id + id * id:
dans le processus de dérivation, comme l'analyse grammaticale descendante est utilisée, il est jugé que E adopte E → ET. Si ce n'est pas possible, il doit revenir en arrière jusqu'à ce que E soit trouvé. → Production E + T.

6. Solutions aux problèmes de retour arrière

6.1 La solution au problème du retour en arrière utilise la méthode d'extraction du facteur de gauche pour transformer la grammaire afin de réduire l'occurrence de retour en arrière dans le processus de dérivation. Bien entendu, la simple extraction du facteur de gauche ne peut pas complètement éviter le phénomène de retour en arrière.

Insérez la description de l'image ici


Pour résumer

Les exigences grammaticales pour l'analyse descendante sont déterminées comme suit:

  1. Non ambigu
  2. Pas de récursion gauche;
  3. Le premier terminateur qui peut être dérivé de chaque candidat de toute variable grammaticale A doit être différent.
  4. Lien: Principes de compilation-définition et classification de la grammaire .
  5. Lien: Principe de compilation-conversion entre grammaire régulière et expression régulière .

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43824348/article/details/111590542
conseillé
Classement