bağlam-bağımlı öncelik kuralları (her ikisi de here tarif edilmiştir) kullanan mutlu burada kodu normal öncelik kuralları kullanan bir, ve bir iki parçacıkları bulunmaktadır.mutlu bağlam-bağımlı Operatör Önceliği
Normal:
%left '+'
%left '*'
%%
Exp :: { Exp }
: Exp '+' Exp { Plus $1 $3 }
| Exp '*' Exp { Times $1 $3 }
| var { Var $1 }
Bağlam bağımlı:
a * b + c * d
Normal versiyonu verir:
Plus (Times (Var "a") (Var "b")) (Times (Var "c") (Var "d"))
giriş Verilen
%left PLUS
%left TIMES
%%
Exp :: { Exp }
: Exp '+' Exp %prec PLUS { Plus $1 $3 }
| Exp '*' Exp %prec TIMES { Times $1 $3 }
| var { Var $1 }
bağlam-bağımlı sürümü oysa
verir:
Times (Var "a") (Plus (Var "b") (Times (Var "c") (Var "c")))
bu ikisi de aynı çıktıyı vermek gerekmez mi? Ne yapıyorum ki burada farklı ayrıştırma ağaçları üretiyorlar?
, beni affet. Bu, '% left' + 'anlamına geliyor mu? % left '*' '* * '+' ve' '*' 'için önceliği bildirir, ancak'% PLUS; % sol TIMES *, "PLUS" ve "TIMES" için önceliğe sahip değil mi? –
@DanielWagner: Ne yazdığım hakkında net olmayan şey neydi? '% kaldı '+'; % left '*' '' + ''ve'' * ''ve'% left PLUS için öncelik beyan eder; % sol TIMES', "PLUS" ve "TIMES" için öncelik beyan eder. Ancak önceliklerin karşılaştırılması her zaman bir üretim ile bir terminal arasında ve% 'si de PLUS; % sol TIMES seçeneği, * '+' ve ''*'' için * önceliklerini bildirmez. Neden olsunVe eğer '' + '' ve '' * ''öncelikleri bildirmemişse,' PLUS 've' TIMES 'önceliklerini karşılaştırmak için hiçbir şey yoktur. – rici
Teşekkürler, bu onu temizler! İkinci örnekteki '+ '' '' '' 'PLUS'un önceliğini karşılaştırmayı denemeyi başaramadım ve başarılı olamadım (çünkü sadece“ PLUS'un önceden bildirilmiş bir önceliği vardır). –