Sofistikovaná syntaktická analýza si často nevystačí s prostou bezkontextovou gramatikou, proto vznikla její různá rozšíření. Jedním opravdu zajímavým je použití feature logic (FL) doplňující reprezentace v podobě syntaktických stromů.
FL pracuje s termy. Každý term je buď konstanta nebo má tvar ft, kde f je (unární) funkční symbol a t term. Atomické formule mají tvar s≈t, kde s a t jsou termy. Formule se skládají rekurzivně pomocí běžných logických spojek (vystačíme s negací a disjunkcí).
Jak je vidět, je FL speciálním případem logiky prvního řádu. Kromě bežných axiomů navíc platí s≈t → φ≈φ[s/t]. FL je rozhodnutelná a pochopitelně korektní a úplná (tedy T ⊢ φ ↔ T ⊨ φ, nicméně modelům FL se zde nevěnuji). V tomto článku se omezíme na formule, jež jsou konjunkcí atomických formulí.
Máme-li bezkontextovou gramatiku, lze každému preterminálu přiřadit formuli v FL a v pravidlech každému neterminálu rovněž. Říkáme, že takováto gramatika přijímá slovo α, pokud jej přijímá ona bezkontextová gramatika sama o sobě a navíc je formule přiřazená počátečnímu symbolu splnitelná.
Takto definovaná gramatika je turingovsky úplná, tj. rozpoznává rekurzivně spočetné jazyky. Při splnění některých vesměs „rozumných“ podmínek rozpoznává rekurzivní jazyky. Uveďme si jednoduchý příklad.
Mějme gramatiku pro analýzu aritmetických výrazů. Preterminál N pro číselné terminály mějmě asociován s formulí fa≈n, kde a je unikátní konstanta (z lexikální analýzy) a n konkrétní číslo ze vstupu. Analýzou řetězce „3“ tedy získáme formuli fa≈3, již lze přímo interpretovat nebo kompilovat.
Pro operaci sčítání mějme pravidlo E → E Op N, kde Op je neterminál pro operaci, v tomto případě s formulí fb≈+ (+ je konstanta reprezentující sčítání). Nechť E, Op, N na pravé straně pravidla mají formule s konstantami a, b, c a E na levé straně pravidla nechť má konstantu d. Potom neterminály na pravé straně pravidla budou asociovány s formulemi gd≈a, d≈b a hd≈c. Například pro výraz „2+3“ přímočaře dostaneme reprezentaci fd≈+ ⋀ fgd≈2 ⋀ fhd≈3, již lze považovat (protože se jedná o splnitelnou formuli) za abstraktní syntaktický strom a dále zpracovat (interpretem či kompilátorem).
Je zřejmé, že strom generovaný bezkontextovou gramatikou reprezentuje konkrétní syntaktický strom, kdežto formule přiřazené uzlům tohoto stromu reprezentují abstraktní syntaktický strom (v obecném případě se pochopitelně nejedná o strom, ale orientovaný acyklický graf).
Že bezkontextová gramatika ve spojení s FL přijímá i jazyky, jež bezkotextové nejsou, se lze snadno přesvědčit konstrukcí pravidel, jež přijímají jazyky {anbncn : n∈N} nebo {ak : k=2n, n∈N}.
@2 Takto je to popsáno "nejlidštěji", jak to jen jde, @3 má pravdu. Gramatiky zná každý (studovaný) informatik, formální logiku také, jen jejich kombinace je obecně neznámá. Princip je primitivní, ovšem nad detaily je třeba se zamyslet. Což je pro většinu lidí zjevně problém :-)
A. co je to preterminal?
B. existuje na to nejaky efektivni algoritmus? Jestli to spravne chapu tak naivni algoritmus by musel:
1. vygenerovat vsechny mozne derivacni stromy te zakladni gramatiky, kterych muze byt obecne exponencialni mnozstvi...
2. pro kazdy derivacni strom sestavit formuli a pomoci SAT/SMT solveru testovat splnitelnost, coz muze mit obecne exponencialni slozitost...
jestli je tohle jediny algoritmus tak to nezni moc uzitecne ;-)
@9 A. Preterminál je neterminál nad terminálem (není mezi nimi jiný neterminál).
B. Velmi dobrá poznámka. Problém je obecně NP úplný. Praktické použití ovšem většinou má max. složitost O(n^3). Naivní algoritmus opravdu vytvoří všechny syntaktické stromy a potom testuje splnitelnost přiřazené formule. K tomu naštěstí existuje relativně efektivní algoritmus (založený na kongruenčních uzávěrech). V praxi se používá tzv. "interleaved" metoda, jež již během parsingu podle pravidel testuje splnitelnost formulí. Protože proces tvorby formulí je monotonní (jen přidáváme další konjunkce), nesplnitelná formule implikuje nesplnitelnost jakékoliv své nadformule, a tedy není třeba v aktuální větvi derivace pokračovat. V praxi tedy na konci (pokud se dostaneme až k počátečnímu symbolu) máme jen ty stromy, ke kterým existuje alespoň jedna splnitelná formule. Zde je zajímavé, že zatímco jakákoliv bezkontextová gramatika se dá zpracovat pro libovolný vstup v čase O(n^3) (jednoznačné gramatiky v O(n^2)), ve spojení s FL je proces analýzy obecně NP úplný. Nicméně praktické úlohy popisují nanejvýš "mildly context sensitive" jazyky a tedy parsing bývá polynomiální.
predpodladam ze jako parsovaci algoritmus pouzivate CYK, kdyz zminujes slozitost n**3. Tam ten problem s disjunkci porad nevidim.
Jediny co me napada je ze kombinace konjunkce a disjunkce by mohla zpusobit exponencialni rust neterminalu pri prevodu do chomskeho normalni formy. Je tohle to co myslis?
Autor se zabývá vývojem kompilátorů a knihoven pro objektově-orientované programovací jazyky.
Přečteno 36 201×
Přečteno 25 361×
Přečteno 23 795×
Přečteno 20 177×
Přečteno 17 874×