( uid_2716 | 2013. 01. 13., v – 23:53 )

Nem tudom, mit jelent a "CF nyelv".

Az LL-t azért szeretik, mert sokkal könnyebb a parser generator-t megcsinálni, és mert a balrekurzió (állítólag) túlértékelt. (Pontosan nem emlékszem, hol olvastam -- vagy a wikipedia-ban, vagy valahol az ANTLR dokumentációjában.)

(Én csináltam LR(1) parser generator-t, ahol magát a nyelvtant is C-ben, függvényhívásokkal állítod össze, aztán megcsináltatod belőle a parser példányokat, amelyekbe aztán (akár párhuzamosan) töltöd bele az adatot, és amelyek hívogatják a redukcióknak megfelelő callback-eket. Sajnos borzasztóan elméletire sikerült a projekt -- funkcionálisan rendben lévőnek tűnt, de iszonyatosan lassú lett. Ha véletlenül érdekelne a kód (ne érdekeljen! :)), az ún. "honlapomon" megtalálod "edp" néven.)

Vannak általánosabb algoritmusok, de azoknak a futásideje rosszabb (O(n^2), O(n^3)). Az LL / LR "lényegében" lineáris az input szöveg hosszával; nincs backtrack.

A részletek már kicsit (nagyon ;)) homályosak, úgyhogy elnézést, ha baromságot írnék, de:

- LL-nél egy adott ponton vagy egyértelműen tudsz új szabály illeszteni (top-down), vagy terminálist elfogyasztani, vagy error-t kapsz; nincs backtrack. A szabályillesztés lehet "téves" is (a hiba az inputnak csak egy későbbi pontján derül ki), de ettől még gyors.

- LR-nél egy adott ponton vagy hibát kapsz, vagy shiftelsz (amely után esetleg több redukció is tüzel sorozatban, ezért neveztem úgy, hogy "lényegében" lineáris).

("n * log n"-es baromság törölve)

Egy általánosabb algoritmus pl. az http://en.wikipedia.org/wiki/Early_parser , a cikkelyben találsz linkeket továbbiakra.

Lásd még a bevezető szöveget itt: http://en.wikipedia.org/wiki/LR_parser