Theodore Norvell (1999) tarafından Özyinelemeli İniş ile İfadeleri Ayrıştırma makalesinde yazar aritmetik ifadeler için aşağıdaki dilbilgisi ile başlar:
E --> E "+" E | E "-" E | "-" E | E "*" E | E "/" E | E "^" E | "(" E ")" | v
bu oldukça kötü, çünkü belirsiz ve sol yinelemeli. Böylece sol özyinelemeyi ondan çıkarmaya başlar ve sonucu şöyledir:
E --> P {B P}
P --> v | "(" E ")" | U P
B --> "+" | "-" | "*" | "/" | "^"
U --> "-"
Ama bu sonuca nasıl ulaştığını anlayamıyorum. Sol özyinelemeyi kendim kaldırmaya çalıştığımda, bunu şu şekilde yapıyorum:
Firs, bir grupta özyineleme bırakmayan üretimleri, diğer bir grupta diğer (sol özyinelemeli) üretimleri bir araya getiriyorum:
E --> E "+" E | E "-" E | E "*" E | E "/" E | E "^" E // L-recursive E --> v | "(" E ")" | "-" E
Sonra, onları adlandırıyorum ve daha kolay manipülasyonlar için faktör:
E --> E B E // L-recursive; B stands for "Binary operator" E --> P // not L-recursive; P stands for "Primary Expression" P --> v | "(" E ")" | U E // U stands for "Unary operator" B --> "+" | "-" | "*" | "/" | "^" P --> "-"
Şimdi sadece ilk iki prodüksiyonla uğraşmam gerekiyor, ki bu artık başa çıkması daha kolay.
Bu ilk iki prodüksiyonu L-özyinelemesiz üretimden (basitçe
P
Birincil ifade) başlayarak ve onuT
, orijinal üretimin geri kalanı olarak ilk sol özyinelemeli nonterminalden daha az olarak tanımladığım isteğe bağlı Kuyruk ile izleyerek yeniden yazıyorum. (olduğunu, sadeceB E
) Tail ardındanT
, veya hangi boş olabilir:E --> P T T --> B E T |
(kuyruk için boş alternatifi not edin).
EBNF'de şu şekilde yeniden yazabileceğim bu iki yapım şöyle:
E --> P {B E}
ki bu neredeyse yazarın elde ettiği şey, ama
E
bunun yerineP
sıfır veya daha fazla tekrarlama modelinin (Kuyruk) içinde var. Sahip olduğu diğer prodüksiyonlarla aynı:P --> v | "(" E ")" | U E B -> "+" | "-" | "*" | "/" | "^" U -> "-"
ama burada da ilk üretimim
E
yerine var .P
P
Benim sorum şu: Ne özlüyorum? Autor ile aynı formun aynısını almak için sözdiziminde hangi cebirsel dönüşüme ihtiyacım var? Ben yerine koyma denedim E
, ama bu sadece beni döngülere götürüyor. Ben yerine nasılsa ihtiyaç şüpheli P
için E
, ama bunu haklı çıkarmak için herhangi bir yasal dönüşümü bilmiyorum. Belki de son eksik adımın ne olduğunu biliyorsunuzdur?