Jaký je vlastně parser Pythonu - LL(1), LR(1), LL(x) nebo něco speciálního? O Pascalu a třeba C se do ví, popravdě o Pythonu jsem v tomto ohledu nenarazil na info.
Mate zrejme na mysli, jaka je gramatika pro Python. Gramatika byvala LL(1), aktualne (od 3.9) je to neco, cemu se rika PEG, aby se zachovala citelnost gramatiky a zaroven obesla nektera omezeni LL(1) -- leva rekurze, nejednoznacnost pravidel.
Viz: https://peps.python.org/pep-0617/
BTW, v clanku o syntakticke analyze bych cekal alespon zminku o bezkontextovych gramatikach.
Jo to jsem myslel, protoze mi LL(1) uz na novy python (typy, list comprehension) nesedela. PEG popravde neznam, to jsme (kdysi) na skole asi nebrali ;)
hmm potom se priznam ze nechapu, jak je mozny zpracovat list comprehension v LL(1), tam prece jeste u zpracovani "[x,y,z" vubec netusim, jestli je to seznam s prvky x, y, a z nebo zacatek nejakyho toho foru. Ale naposledy jsme to brali na skole, tak mi mozna neco uniklo nebo jsem to pustil z hlavy, to je pravdepodobny :)
Tohle se běžně parsuje jako seznam a podle ukončení se pak parsování rozvětví, takže když uvidí “for”, vytvoří jiný AST.
Neznám Python nijak do hloubky, ale zde je další token buď čárka, nebo uzavírající závorka, nebo “for”, ne?
Toto je validni:
[(k,v) for k,v in x.items()]
Az nekde u toho for, tedy u sedmeho tokenu, je jasny, o co jde, takze LL(7)?
Protoze toto je validni naprosto stejne:
k=1
v=2
[(k,v)]
Mezi otevírající závorkou a “for” je jeden neterminál, pokud je jeho gramatika LL(1), tak by to celé mělo být LL(1). Jde to snadno ověřit, stačí si napsat “recursive descent” pro tento fragment gramatiky a kouknout na použité “výhledy”. Přinejmenším v Julii to takto je, pokud Python nemá nějaký extrabuřt, bude to stejné.
To je hlavně úplně irelevantní, protože to nijak nesouvisí se syntaxí, to je sémantika, která nemá na gramatiku vůbec žádný vliv.
"v clanku o syntakticke analyze bych cekal alespon zminku o bezkontextovych gramatikach"
To je pro vývojáře všeobecná znalost, předpokládá se, že to všichni znají.
K te poznamce: on Python striktne receno nema CFG, zrovna kvuli INDENT/DEDENT, ktere potrebuji kontextovou informaci
To s tou kontextovostí je vůbec zajímavé, člověk si napíše CFG (klidně víceznačnou), přidá k tomu nějakou anotaci a najednou má mnohem silnější gramatiku, klidně typu 0. Atributové gramatiky by mohly vyprávět :)
Python od verze 3.9 nema CFG ale PEG, viz odkazovany https://peps.python.org/pep-0617/
INDENT/DEDENT resi tokenizer, takze s porusenim LL(1) nijak nesouvisi, protoze pro CFG (starsich pythonu, napr https://docs.python.org/3.7/reference/grammar.html) se jedna o neterminal.
EDIT: V druhem odstavci ma samozrejme byt:
"INDENT/DEDENT ... se jedna o terminal."
(puvodne jsem tam mel "nejedna se o neterminal", ale zdalo se mi to tak kostrbate, az jsem to napsal naopak :-D ).
K 10 let staremu filozofickemu prispevku, jestli byl Python context-free. Za me to je jedno, naprosta vetsina prekladacu programovacich jazyku pouziva nejake triky tohoto typu, aby parser mohl byt efektivni a gramatika se dala lidsky cist. Autor tam spravne pise, "Given this lexer, the parser is a context-free, LL(2) parser". Jen ma pocit, ze tokenizer je prilis chytry a v tom se neshodnem.
Nicmene, evidentne i autorum gramatiky Pythonu zacalo vadit, ze nektere syntakticke veci nemohou poresit v gramatice a musi je resit az o uroven vyse, proto zrejme presli na PEG.
5. 8. 2022, 08:43 editováno autorem komentáře