2016-03-24 35 views
0

doğru durumuna mı lr çatışmayı azaltın A -> aTanımı/(1) ayrıştırma

bir -...> alfa, beta

Takip (a) birinci (beta) ayrık değildir, örneğin

bir terminal olmayan bir alfa ve beta olan olan

muhtemelen boş dilbilgisi sembollerinin dizileri. "

Not (o vardiya veya azaltmak için uygun olup olmadığını, yığının ve lookahead üst dayanarak, belirlemenin bir yolu yoktur çünkü Sezgisel şudur): Siz bu herhangi bağlıdır düşünüyorsanız İlk/takip yorumunun tanımının özellikleri ve ben sağlayacağım.

+1

Evet, tanımlandığı gibi oldukça fazla. – tripleee

+0

Bunun bir S/R çatışması olması gerekip gerekmediğini veya her S/R çatışmasının bu forma sahip olup olmadığını mı soruyorsunuz? – rici

+0

@rici iyi nokta, demek istediğim her S/R çatışması bu formda –

cevap

1

Hayır, bu ifade doğru değil.

  • yapımları ikisini de içerir: bir gramer varsayalım

    • bir → α
    • bir → α β
  • TAKİP (A) ∩ BİRİNCİ (β)Bu terminal olmayan A ileri yönlü TAKİP (A) ∩ içeren bir bağlamda ulaşılabilir olmasını gerektirir, çünkü gramer, bir kayma-azaltmak çakışma için oldukça yeterli değildir∅

İLK (β).

yüzden dilbilgisi azaltılmasını, ya da en azından herhangi ulaşılmaz ya faydasız yapımları içermemesi için ihtiyacımız olması halinde, bir kayma-azaltmak çatışmayı üretmek için yukarıdaki yeterli olduğunu. Ancak, yukarıdaki koşullar numaralı no'lu şartlar için gerekli değildir, çünkü vardiya ve indirmenin aynı terminal dışı, hatta "ilgili" terminal olmayanlar için geçerli olması gerekmez. Aşağıdaki basit dilbilgisi düşünün:

dilbilgisi (o ki, belirsiz değil) ID . ( ID çünkü expr düşürüldü olabilir ve daha sonra stmt veya ( olabilir içerikli halde bir kayma-azaltmak çakışma var O
prog → stmt 
prog → prog stmt 
stmt → expr 
stmt → func 
expr → ID 
expr → '(' expr ')' 
func → ID '(' ')' stmt 

func → ID '(' ')' stmt'un parçası olarak kaydırılabilir.


bir yan nokta olsa da, TAKİP seti fazlalaştı sadece SLR (k) gramerlerin yapımında kullanılır.Kanonik LR (k) konstrüksiyonu - ve hatta LALR (k) inşası - tam bir lookahead hesabı yerine FOLLOW setinin kullanılmasının bir (varolmayan) vardiya-azaltmasını göstereceği gramer için başarılı bir şekilde parserler üretecektir. fikir ayrılığı. Biraz daha anlamlı olmayan terminali adlarla düzenlenmiş (benim kopyasında örnek 4.39) Ejderha kitabından alınmıştır klasik örneği,: Burada

stmt → lvalue '=' rvalue 
stmt → rvalue 
lvalue → '*' rvalue 
lvalue → ID 
rvalue → lvalue 

, (rvalue) {=, $ olduğunu TAKİP} ve bunun sonucu olarak {stmt → lvalue · '=' rvalue, rvalue → lvalue ·}, rvalue numaralı bir hatanın azaltılması mümkündür ve bu da yanlış bir kaydırma azaltma çakışmasına neden olur.

+0

Bu harika bir cevaptır. Teşekkür ederim. Bildirimi/tanımımı düzeltmek için, dilbilgisinin gereksiz/erişilemez indirimler içermediğini ve öğelerin A -> α olarak değiştirilmesi gerektiğini belirtmek için değiştirilebilir. ve B -> α.β örneğin LHS gerektirmeyen her durumda aynı mıdır? Bu yorumu belirledikten sonra daha sonra tekrar kabul et/kabul et. –

+0

@ N.McA .: Yorumunuzdaki koşul mutlaka bir kaydırma azaltma çakışması değildir. Bu benim ikinci örneğim için geçerli, ancak bu gramerde kanonik LR (1) ayrıştırıcısı (ya da bir LALR (1) ayrıştırıcıyı) kullanarak kayma azaltma çatışması yok. – rici

+0

Ah, bunun nasıl olacağını soracaktım. dava. Bir SLR (1) çözümleyicinin, azaltma işlemlerini belirlemek için takip setlerini kullandığımız bir düşünceyi doğru buluyorum, bu bir çatışma mıdır? Bu da SLR ve Canonical LR tarafından kabul edilen gramer setlerinin farklı olduğunu ima eder. –