3

Comment éliminer la récursion gauche pour la grammaire suivante?Élimination de la récursivité à gauche pour E: = EE + | EE- | id

E := EE+|EE-|id 

Utilisation de la procédure commune:

A := Aa|b 

se traduit:

A := b|A' 
A' := ϵ| Aa 

Appliqué à la grammaire originale que nous obtenons:

A = E, a = (E+|E-) and b = id 

Par conséquent:

E := id|E' 
E' := ϵ|E(E+|E-) 

Mais cette grammaire est incorrecte parce que

ϵE+ -> ϵ id + 

serait valable mais qui est une expression de Postfix incorrecte.

+0

Vous devriez peut-être mentionner que '' e' est vraiment ε'. Trompé moi, en tout cas. –

+0

Vous avez un problème dans votre définition de «traduire vers»: vous avez introduit un terme non défini «e». Vous pouvez probablement faire quelque chose en regroupant l'original comme 'E: = (EE (+ | -)) | id'. Votre dernier commentaire "qui est une expression de postfix incorrect" est quelque peu radicale; pourquoi 'e id +' est-il incorrect? Cela ressemble à 'pousser e; push id; évaluer + 'qui est généralement OK. –

+0

@Konrad: ah - 'e' est vide? ... cela fait une différence. –

Répondre

10

Votre "procédure courante" est incorrecte. Prendre du dragon livre:

A := Aα | β 

devient

A := βA′ 
A′ := αA′ | ϵ 

... qui donne:

E := id E′ 
E′ := (E + | E -) E′ | ϵ 
+0

Comment entrez-vous des symboles mathématiques? – TheOne

+1

Absolute0: simple astuce: j'utilise une table de caractères. Je suis sur OS X qui a un outil pour ça. Sous Windows, vous pouvez utiliser 'charmap.exe' qui est caché dans le menu principal" Accessoires "(il faut cependant passer à Unicode). –