2010-11-14 14 views

cevap

8

Evet, LL ve LR hem Soldan sağa verileri ayrıştırmak beri; ve LL (1) sadece bir jetonu göz önüne aldığından, mutlaka bir LR (1) olmalıdır. Bu aynı zamanda bir LR (k) gramer beri k> 1, bir LR (1) gramer dönüştürülebilir LR (k) için de geçerlidir. bu LR LL soldaki türetme üretir sağdaki türetme üretir içinde

LR ve LL gramerlerin arasındaki fark gelir. Yani bu, bir LR ayrıştırıcısının aslında yapraklardan oluşturulduğu kadar LL dilbilgisinden daha büyük bir seti ayrıştırabileceği anlamına gelir.

A -> "(" A ")" | "(" ")" 

Sonra LL (1) dizesini (()) ayrıştırmak olacaktır:

aşağıdaki gibi yapımları var Diyelim

(()) -> A 
    -> "(" A ")" 
    -> "(" "(" ")" ")" 

olarak LR (1) olarak ayrıştırmak izlediğinde:

Input Stack   Action 
(()) 0  
()) 0 '(' 
))  0 '(' '(' 
)  0 '(' '(' ')' Reduce using A -> "(" ")" 
)  0 '(' A 
-  0 '(' A ')' Reduce using A -> "(" A ")" 
-  0 A   Accept 

Daha fazla bilgi için bkz: http://en.wikipedia.org/wiki/LL_parsing

+0

ancak ayrıştırmak için LL (1) kullandığı dizisi (yapımların) LR tarafından kullanılan (yapımların) karşısında dizide her zaman değil (1) ayrıştırmak için. Her ne kadar öncekiler aşağıdan yukarıya ve ikincisi ayrıştırıcıdan aşağıya doğru olsa da, LL (1) 'in LR (1) olması için nedeniniz yeterli görünmüyor. – siddharth

+1

şey olmak LR ayrıştırma ağacı ters LL Çözümleme ağacının aynı olması ile anlamına gelmez ve dolayısıyla ayrıştırıcı mutlaka ters sırayla yapımları kullanmaz. Bunun anlamı, bir LR ayrıştırıcısının, aynı dilbilgisi verilen aynı dizeleri doğru bir şekilde ayrışabilmesidir. – Mike

+0

Bu gerçek çelişiyor mu? http://cs.stackexchange.com/questions/60763/does-my-grammar-contradict-ll-⊆-lr1/60764#60764 – Pranav