Лева рекурзија
Дефиниција
уреди„Граматика је лево рекурзивна ако садржи нетерминал А, такав да се из њега може извести реченична форма која почиње тим симболом.”[1]
Непосредна лева рекурзија
уредиНепосредна лева рекузија се јавља у правилима облика
Где су α и β реченичне форме и β не почиње симболом А.
Пример : Правило
садржи непосредну леву рекурзију. Анализатор рекурзивним спустом би изгледао на пример овако :
- function Expr() {
- Expr(); match('+'); Term();
- }
и анализатор би упао у бесконачну рекурзију када би покушао да анализира граматику која садржи ово правило.
Посредна лева рекурзија
уредиПосредна лева рекурзија у најједноставнијем облику могла би се дефинисати следећим правилима:
Из којих би се могло добити извођење:
Уопштено говорећи, за нетерминале , посредна лева рекурзија може се дефинисати постојањем форме:
Где су реченичне форме.
Елиминација леве рекурзије
уредиЕлиминација непосредне леве рекурзије
уредиСледи алгоритам уклањања непосредне леве рекурзије. Постигнуто је неколико унапређења овог метода, укључујући и она описана у чланку "Removing Left Recursion from Context-Free Grammars"[2], који је написао Robert C. Moore.
За свако правило облика
Где важи:
- Нетерминал А поседује леву рекурзију
- је непразна реченична форма ( )
- је реченична форма која не почиње симболом А.
Заменимо А-правило правилом:
Где је А’ нови нетерминал за који важи:
Новодобијени симбол се често назива „реп” или „остатак”.
Елиминација посредне леве рекурзије
уредиАко је граматика својствена, тј. ε-слободна (без правила облика ) и без једностуких правила (ни за један нетерминал А не постоји извођење облика ), ово је општи алгоритам који се може применити за уклањње посредне леве рекурзије:
Претходно међу нетерминалима успоставимо неки (било какав) поредак , ... .
- for i = 1 to n {
- for j = 1 to i – 1 {
- ако су правила
-
- свако правило облика заменимо са
- }
- елиминишемо непосредну леву рекурзију за
- for j = 1 to i – 1 {
- }
Пример
уредиПосматрајмо граматику аритметичких израза:
Expr и Term су лево рекурзивна. Уведимо нове помоћне симболе Expr’ и Term’. Примена наведеног поступка даје следећу граматику без лево рекурзивних правила:
Погледајте још
уредиБелешке
уреди- ^ Notes on Formal Language Theory and Parsing Архивирано на веб-сајту Wayback Machine (28. август 2017), James Power, Department of Computer Science National University of Ireland, Maynooth Maynooth, Co. Kildare, Ireland.JPR02
- ^ Removing Left Recursion from Context-Free Grammars, Robert C. Moore, Microsoft Research, Redmond, WA, USA