Question

si j'ai une grammaire ayant une production qui contient à la fois la récursivité gauche et l'affacturage gauche comme

$ \ qquad \ displaystyle F \ au milieu des années FBA cds \ le milieu c $

que l'on a la priorité, récursivité gauche ou affacturage gauche?

Était-ce utile?

La solution

Les transformations telles que l'affacturage gauche ou la suppression gauche récursion ne pas les règles de priorité. De toute évidence, les grammaires résultant peuvent être différents mais ils reconnaîtront la même langue.

La grammaire exemple de la question est plus difficile que le problème des devoirs étudiant de premier cycle typique. Montrant ainsi notre travail sera utile.

Gauche Recursion

Définissons une transformation qui enlève à gauche récursivité.

Étant donné

$ \ qquad \ displaystyle A \ à A \ alpha_0 \ mid A \ alpha_1 \ mid \ points \ mid A \ alpha_n \ mid B \ beta_0 \ mid B \ beta_1 \ mid \ points \ mid B \ beta_n $,

nous enlever récursivité gauche comme ceci:

$ \ qquad \ displaystyle \ begin {align}     A_h & \ à B beta_0 \ mid B \ beta_1 \ mid \ points \ mid B \ beta_n \\     A_t & \ à \ alpha_0 \ mid \ alpha_1 \ mid \ points \ mid \ alpha_n \\     A_ {t} ^ + & \ {à A_t A_ t ^ +} \ mi A_t \\     A & \ {à A_h A_ t ^ +} \ mi A_h \ End {align} $

La généralité ci-dessus est généralement pas donné dans les textes du compilateur, mais les textes d'analyse syntaxique comme Grune & Jacobs ne couvrent cela. affacturage gauche peut être appliquée à la grammaire ci-dessus transformé, mais sera tout simplement introduire des règles supplémentaires qui ne changeront pas la réponse. Nous allons donc Simplify la présentation sans affacturage supplémentaire gauche en cours d'exécution.

Dans cette réponse, nous ne couvrirons pas les questions indirectes gauche de récursion parce que nous ne nous intéressons à un seul règles pour non terminaux. Notez que la récursivité indirecte gauche peut être traitée, si. (Ouvrir une autre question si cela est important.)

Affacturage gauche

Suppression de l'affacturage gauche est dans la plupart des textes du compilateur d'introduction fait comme ça. Compte tenu de

$ \ qquad \ displaystyle A \ x à y \ x z mi $

rendements d'affacturage gauche:

$ \ qquad \ displaystyle \ begin {align} A_s & \ à y \ z \\ mi A & \ x à A_S \ End {align} $

Maintenant que Perform les transformations dans les deux commandes.

affacturage gauche premier

facteur gauche Soit la grammaire de la question

$ \ qquad \ displaystyle \ begin {align}     F_S & \ S à D \ mid \ varepsilon \\     F & \ F B a \ c mi F_S \ End {align} $

puis retirez la récursion gauche:

$ \ qquad \ displaystyle \ begin {align}     F_h & \ à c \\ F_S     F_t & \ B à un \\     F_ {t} ^ + & \ {à F_t F_ t ^ +} | F_t \\     F_S & \ S à D \ mid \ varepsilon \\     F & \ pour F_h {t F_ ^ +} \ mi F_h \ End {align} $

Retrait récursivité gauche premier

Et pour l'autre commande, retirons récursivité gauche de la grammaire de la question

$ \ qquad \ displaystyle \ begin {align}     F_h & \ c à D S \ mid c \\     F_t & \ B à un \\     F_ {t} ^ + & \ {à F_t F_ t ^ +} \ mi F_t \\     F & \ pour F_h {t F_ ^ +} \ mi F_h \ End {align} $

et puis à gauche facteur terminal $ c $:

$ \ qquad \ displaystyle \ begin {align}     F_ {hs} et \ D à S \ mid \ varepsilon \\     F_h et \ c à F_ {} \\ hs     F_t & \ B à un \\     F_ {t} ^ + & \ {à F_t F_ t ^ +} \ mi F_t \\     F & \ pour F_h {t F_ ^ +} \ mi F_h \ End {align} $

Aha, les grammaires résultant sont les mêmes!

En général, ce qui prouve que deux grammaires sont équivalentes est indécidable. Donc, si une transformation de grammaire de la série pourraient influencer le langue qui est reconnue puis, il serait désastreux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à cs.stackexchange
scroll top