Syntaktická analýza: Porovnání verzí

Smazaný obsah Přidaný obsah
WikitanvirBot (diskuse | příspěvky)
m r2.7.1) (robot přidal: ar:التحليل النحوي
m Kategorie.
Řádek 1:
[[Soubor:Parsing-example.png|thumb|right|Příklad syntaktické analýzy matematického výrazu.]]
 
'''Syntaktická analýza''' (slangově podle [[Angličtina|angličtiny]] též ''parsování'' nebo ''parsing'') se v  [[Informatika|informatice]] a v  [[Lingvistika|lingvistice]] nazývá proces analýzy posloupnosti formálních prvků s  cílem určit jejich gramatickou strukturu vůči předem dané (byť ne nutně explicitně vyjádřené) [[Formální gramatika|formální gramatice]].
 
Program, který vykonává tuto úlohu, se nazývá '''syntaktický analyzátor''' (slangově ''parser'').
Řádek 7:
Syntaktickou analýzou se transformuje vstupní text do [[datová struktura|datové struktury]], většinou [[strom (graf)|stromu]], jenž je vhodný pro pozdější zpracování a který zachovává hierarchii vstupních dat.
 
Vstupním krokem syntaktické analýzy je zpravidla [[lexikální analýza]], při níž se ze vstupního textu vytváří posloupnost tzv. ''[[token]]ů'', tedy elementárních nositelů významu v  rámci daného formálního jazyka. Tokenem může být např. závorka, [[literál]], číslo, řetězec, [[klíčové slovo]], symbol a pod. Pro parser je to již dále nedělitelná základní stavební jednotka, které má uloženy v  listech načteného datového stromu a které použije v  interpretaci vstupních dat.
 
Existují i programy, schopné ze specifikace [[programovací jazyk|programovacího jazyka]] zapsaného v  [[Backus-Naurova notace|Backus-Naurově notaci]] vytvořit příslušný parser, např. [[Yacc]] (''yet another compiler compiler'').
 
== Lidské jazyky ==
Řádek 15:
Při některých metodách počítačového zpracování lidského jazyka se používá počítačových programů, které dokáží lidský jazyk syntakticky analyzovat. Tento úkol je dosti ztížen skutečností, že stavba lidského jazyka je zpravidla velmi nejednoznačná.
 
Pro syntaktickou analýzu lidského jazyka musí být nejprve stanovena příslušná formální gramatika. Volba její syntaxe závisí na záměrech jednak lingvistických, jednak implementačních. Některé analytické systémy například používají [[lexikálně-funkční gramatika|lexikálně-funkčních gramatik]], ovšem v  takovém případě je syntaktická analýza z  hlediska složitosti [[NP-úplnost|NP-úplným]] problémem. Další pro syntaktickou analýzu často užívanou lingvistickou formalizací je [[HPSG gramatika]], avšak některé projekty využívají i mnohem jednodušších formalizací (viz např. [[korpus syntaktických stromů]] [http://www.cis.upenn.edu/~treebank/ Penn Treebank]). [[Povrchová syntaktická analýza]] se zaměřuje jen na rozčlenění vstupního textu na hlavní součásti jako jmenné fráze. Jinou často využívanou možností, jak se vyhnout jazykové víceznačnosti, je syntaktická analýza podle [[dependenční gramatika|dependenční gramatiky]].
 
Moderní syntaktické analyzátory bývají alespoň částečně [[Statistika|statistické]], tedy opírají se o korpus dat, která byla analyzována ručně. Pomocí takového korpusu může program získat informace o frekvenci výskytu různých gramatických konstrukcí ve specifických kontextech (viz též [[strojové učení]]). Používané metody zahrnují [[Pravděpodobnostní bezkontextová gramatika|pravděpodobnostní bezkontextové gramatiky]], [[Metoda maximální entropie|metodu maximální entropie]] a [[neuronové sítě]]. Většina úspěšnějších systémů užívá metody lexikální statistiky, tj. posuzuje slova v  mj. závislosti na jejich slovním druhu. Takové systémy však mohou podléhat tzv. přeučení ({{cizojazyčně|en|[[overfitting]]}}) a pro dosažení efektivity vyžadují pečlivé doladění.
 
Algoritmy pro syntaktickou analýzu přirozených jazyků musí zacházet s  gramatikami mnohem složitějšími a nepřehlednějšími, než jsou „hezké“ gramatiky umělých programovacích jazyků. Jak již bylo řečeno, některé gramatické struktury jsou pro analýzu výpočetně velmi složité. Obecně se i v  případě gramatických struktur, které se nedají vyjádřit bezkontextově, užívá zjednodušených bezkontextových gramatik, pomocí nichž se provádí první krok analýzy. Algoritmy, které využívají bezkontextových gramatik, často spočívají na některé variantě [[Algoritmus CKY|algoritmu CKY]], zpravidla doplněného [[Heuristika|heuristikou]], která umožňuje vyřadit nepravděpodobné možnosti a tak ušetřit čas (viz též [[tabulková analýza]]). Některé systémy se snaží snížit výpočtovou složitost na úkor přesnosti užitím algoritmů [[LR analýza|LR analýzy]] pracujících v  lineárním čase. Relativně novou metodou pak je {{cizojazyčně|en|[[parse reranking]]}}, při kterém syntaktický analyzátor navrhne vícero možných analýz, a složitější systém pak vybere, která z  nich je nejvhodnější.
 
== Programovací jazyky ==
 
Syntaktické analýzy se obvykle užívá při [[Kompilace (programování)|kompilaci]]. Kompilátor nejprve syntakticky analyzuje [[zdrojový kód]] programu, napsaný v  určitém [[programovací jazyk|programovacím jazyku]], a převede jej do interní podoby, s  níž poté dále pracuje.
 
Programovací jazyky bývají specifikovány [[Bezkontextová gramatika|bezkontextovými gramatikami]], protože pro ty se dá vytvořit rychlý a efektivní syntaktický analyzátor. Ten však obvykle nebývá programován ručně, nýbrž generován zvláštním programem, tzv. [[parser generátor]]em, na základě předepsané gramatiky.
 
Bezkontextové gramatiky zpravidla nejsou schopny vyjádřit vše, co jazyk vyžaduje. Zjednodušeně se dá říci, že bezkontextově vyjádřený jazyk má omezenou paměť. Bezkontextová gramatika nemá prostředky k  zapamatování předchozího výskytu konstruktu, pokud může být oddělen libovolně dlouhým jiným textem — nedokáže tedy třeba rozpoznat, zda byl identifikátor před použitím deklarován. Mocnější gramatiky, které toto dokáží, zase nemohou být efektivně syntakticky analyzovány. Proto se běžně vytváří bezkontextový parser, který rozpoznává nadmnožinu požadovaných jazykových konstruktů (tj. přijme i některé neplatné) s  tím, že později budou tyto neplatné konstrukty vyřazeny.
<!--
prosím případné spolupřekladatele, aby překládali jen to, čemu rozumějí!!! (Mmh)
 
=== Overview of process ===
 
The following example demonstrates the common case of parsing a computer language with two levels of grammar: lexical and syntactic.
 
The first stage is the token generation, or [[lexical analysis]], by which the input character stream is split into meaningful symbols defined by a grammar of [[regular expression]]s. For example, a calculator program would look at an input such as "12„12*(3+4)^2"2“ and split it into the tokens 12, *, (, 3, +, 4, ), ^ and 2, each of which is a meaningful symbol in the context of an arithmetic expression. The parser would contain rules to tell it that the characters *, +, ^, ( and ) mark the start of a new token, so meaningless tokens like "12„12*" or "(3"3“ will not be generated.
 
The next stage is syntactic parsing or syntactic analysis, which is checking that the tokens form an allowable expression. This is usually done with reference to a [[context-free grammar]] which recursively defines components that can make up an expression and the order in which they must appear. However, not all rules defining programming languages can be expressed by context-free grammars alone, for example type validity and proper declaration of identifiers. These rules can be formally expressed with [[attribute grammar]]s.
Řádek 45:
== Typy syntaktické analýzy ==
 
Úkolem syntaktického analyzátoru je zjistit, zda a jak je možno vstupní text vygenerovat z &nbsp;[[Počáteční symbol gramatiky|počátečního symbolu gramatiky]]. Tohoto úkolu se analyzátor může zhostit jednou ze dvou základních metod:
 
* [[LL syntaktický analyzátor|Syntaktická analýza shora dolů]] — Parser začíná počátečním symbolem a snaží se převést jej na vstup. Schematicky řečeno začíná největšími prvky, které postupně rozbíjí na menší části, dokud se nedostane k &nbsp;[[Terminální symbol|terminálním symbolům]], které může porovnat se vstupem. Příkladem syntaktické analýzy shora dolů je [[LL analýza]].
* [[Syntaktická analýza zdola nahoru]] — Parser začíná vstupním textem a snaží se jej převést na počáteční symbol. Prakticky tedy hledá nejprve pravidla, která obsahují dané terminální symboly, pak pravidla, která mohou takovým pravidlům předcházet atd. Příkladem syntaktické analýzy zdola nahoru je [[LR analýza]]. Jiný termín pro tento druh syntaktické analýzy je {{cizojazyčně|en|shift-reduce parsing}} (doslova „posuň-zmenši“, česky označováno jako „přesun-redukce“).
 
Řádek 53:
 
== Literatura ==
 
* Molnár, Ľudovít – Češka, Milan – Melichar, Bořivoj: ''Gramatiky a jazyky''. Bratislava : Alfa, 1987.
 
== Související články ==
 
* [[Syntaktická analýza zdola nahoru]]
 
== Externí odkazy ==
 
* [http://www.cs.vu.nl/~dick/PTAPG.html Parsing Techniques - A Practical Guide] - kniha podle Dick Grune a Ceriel J.H. Jacobs, dostupná v &nbsp;PDF i PostScript
 
<!--
 
== Příklady syntaktických analyzátorů (parserů) ==
 
 
=== Parsery se syntaktickou analýzou ''shora dolů'' ===
 
Některé z &nbsp;parserů se syntaktickou analýzou ''shora dolů'' zahrnují např.:
* [[Recursive descent parser]]
* [[LL parser]]
Řádek 72 ⟶ 79:
* [[Earley parser]]
-->
<!--
 
=== Parsery se syntaktickou analýzou ''zdola nahoru'' ===
 
Některé z &nbsp;parserů se syntaktickou analýzou ''zdola nahoru'' zahrnují např.:
* [[Precedence parser]]
** [[Operator-precedence parser]]
Řádek 87 ⟶ 96:
 
== See also ==
 
===Parsing concepts===
 
=== Parsing concepts ===
 
* [[Chart parser]]
* [[Compiler-compiler]]
Řádek 94 ⟶ 106:
* [[Shallow parsing]]
 
=== Parser Development Software ===
 
See also: [[List of Parsers]] comparison table.
 
==== Free Software ====
 
* [[ANTLR]]
* [[GNU bison|Bison]]
Řádek 108 ⟶ 123:
* [[Spirit Parser Framework]]
* [[Yacc]]
 
===== Wikimedia =====
 
* [[m:Help:ParserFunctions|Help:ParserFunctions]]
 
==== Commercial ====
 
* [[LRgen]]
* [[Visual BNF]]
Řádek 118 ⟶ 136:
<!-- //pův. text
 
'''Parsování''' ({{cizojazyčně|en|parsing}}) v &nbsp;[[informatika|informatice]] znamená načítání zformátovaných dat. Parsování probíhá například při [[překladač|překladu]] nebo [[interpreter|interpretaci]] zdrojových programů nebo skriptů, ale za parsování může být pokládán i proces při zobrazování zdrojového textu článků [[Česká Wikipedie|Wikipedie]] v &nbsp;[[HTML]].
 
Program nebo jeho část, která parsování provádí, se nazývá '''parser'''.
 
== Odlišnosti od prostého načítání dat ==
 
*Jsou dopředu dána pravidla, popisující formát parsovaných dat.
*Data jsou zformátována na části, kterým se ve většině případů říká '''elementy'''. Většinou se (opět, podle daných pravidel) mohou některé elementy vyskytovat v &nbsp;jiných elementech.
*Parser vždy ví, který element zrovna načítá.
*Parsování je pomalejší než načítání prostého textu nebo binárního proudu, protože musí zkoumat každý znak.
Řádek 133 ⟶ 152:
 
[[Kategorie:Formální jazyky]]
[[Kategorie:Zpracování přirozeného jazyka]]
[[Kategorie:Algoritmy]]
 
[[id:Parsing]]
[[ar:التحليل النحوي]]
[[ca:Analitzador sintàctic]]
[[de:Parser]]
[[en:Parsing]]
[[es:Analizador sintáctico]]
[[fa:تجزیه کننده]]
[[fi:Jäsennin]]
[[fr:Décomposition analytique]]
[[hr:Parsiranje]]
[[hu:Elemző (informatika)]]
[[id:Parsing]]
[[it:Parsing]]
[[hu:Elemző (informatika)]]
[[ja:構文解析]]
[[ko:구문 분석]]
[[mk:Парсер]]
[[nl:Parser]]
[[pl:Analizator składniowy]]
[[pt:Análise sintática (computação)]]
[[ro:Parsare]]
[[fi:Jäsennin]]
[[sv:Parser]]
[[mk:Парсер]]
[[ru:Синтаксический анализ]]
[[sr:Parsiranje]]
[[sv:Parser]]
[[ta:இலக்கணப் பாகுபடுத்தி]]
[[uk:Синтаксичний аналіз]]
[[ar:التحليل النحوي]]
[[fa:تجزیه کننده]]
[[ta:இலக்கணப் பாகுபடுத்தி]]
[[zh:語法分析器]]
[[ja:構文解析]]
[[ko:구문 분석]]