Úvodní stránka | Tato stránka v originále

Kontext-uvolnit gramatiku

V informatice, kontext-uvolnit gramatiku (CFG) je formální gramatika ve kterém každé pravidlo výroby je formy

V -> w
kde V je non-symbol terminálu a w řetězec sestává z terminálů a/nebo non-terminály. Termín “kontext-volný” přijde z rysu to proměnná V moci vždy být nahrazen w, v žádné záležitosti jaký kontext to nastane. formální jazyk je kontext-volný jestliže tam je kontext-uvolnit gramatiku, která tvoří to.

Kontext-volné gramatiky jsou důležité, protože oni jsou silní dost popisovat syntax programovacích jazyků; ve skutečnosti, téměř všechny programovací jazyky jsou definovány přes kontext-uvolnit gramatiky. Na druhé straně, kontext-volné gramatiky jsou jednoduché dost dovolit stavbu účinný rozebrat algoritmy, které pro daný řetězec stanoví zda a jak to může být produkováno z gramatiky. Viďte LR analyzátor a LL analyzátor pro příklady.

BNF (Backus-Naur se tvoří) je často zvyklý na výslovný kontext-uvolnit gramatiky.

Tabulka s obsahem
1 příklady
2 původy a stromy syntaxe
3 normální formy
4 vlastnosti kontextu-uvolnit jazyky

Příklady

Příklad 1

Jednoduchý kontext-volná gramatika je

S -> aSb | a epsilon;
kde | je zvyklý na oddělené různé možnosti pro stejný non-terminál a a epsilon; kandiduje na prázdný řetězec. Tato gramatika tvoří jazyk

který není pravidelný.

Příklad 2

Tady je kontext-uvolnit gramatiku pro syntactically správné infixové algebraické výrazy v proměnných x, y a z:

S -> T + S | T - S | T
T -> U * T | U / T
U -> (S) | x | y | z
Tato gramatika může například tvořit řetězec “(x + y) * x - z * y / (x + x)”.

Příklad 3

Kontext-uvolnit gramatiku pro jazyk sestávat ze všech řetězců přes {, b} který obsahovat různé číslo než b je

S -> U | V
U -> TaU | tretka
V -> TbV | TbT
T -> aTbT | bTaT | a epsilon;
Tady, T moci tvořit všechny řetězce se stejným číslem jak b , U tvoří všechny řetězce s více než b a V tvoří všechny řetězce s méně než b .

Původy a stromy syntaxe

Tam jsou v podstatě dva způsoby, jak popsat jak v jisté gramatice řetězec může být odvozen ze symbolu začátku. Nejjednodušší cesta má vypsat nepřetržité řetězy symbolů, začátku se symbolem začátku a konce s řetězcem a pravidla, která byla platila. Jestliže my představíme strategii takový jak “vždy nahradit odešel-nejvíce nonterminal nejprve” pak pro kontext-uvolnit gramatiky seznam aplikovaných mluvnických pravidel je sám dostatečný. Toto je nazýváno leftmost původem řetězce. Například, jestliže my vezmeme následující gramatiku:

(1) S -> S + S
(2) S -> 1
a řetězec “1 + 1 + 1” pak levý původ tohoto řetězce je seznam [(1), (1), (2), (2), (2)]. Analogously původ rightmost je definován jako seznam, který my dostaneme jestliže my vždy nahradíme nonterminal rightmost nejprve. V tomto případě toto by byl seznam [(1), (2), (1), (2), (2 )].

Rozlišení mezi leftmost původem a rightmost původem je důležité, protože ve většině analyzátorech transformace vstupu je definována tím, že dává kus kódu každého mluvnického pravidla to je vykonáno vždy, když pravidlo je aplikováno. Proto to je důležité vědět to zda analyzátor určuje leftmost nebo původ rightmost, protože toto stanoví pořadí ve kterém kusy kódu budou provedené. Vidět pro příklad LL analyzátory a LR analyzátory.

Původ také uloží v nějakém smyslu hierarchická struktura na řetězci, který je pocházela. Například struktura řetězce “1 + 1 + 1” odkázaný, shodovat se k původu leftmost, být:

S->S+S (1)
S->S+S+S (1)
S->1+S+S (2)
S->1+1+S (2)
S->1+1+1 (2)

{ { { 1 }S + { 1 }S }S + { 1 }S }S
kde {...}S ukáže podřetězec uznaný jak patřící k S. tato hierarchie může také být viděna jako strom:

           S
          /|\\
         / | \\
        /  |  \\
       S  '+'  S
      /|\\      |
     / | \\     |
    S '+' S   '1'
    |     |
   '1'   '1'

Tento strom je nazýván betonovým syntaktickým stromem (vidět také oddělit strom syntaxe) řetězce. V tomto případě představované leftmost a původ rightmost definují stejný syntaktický strom, nicméně je další (leftmost) původ stejného řetězce možný

S-> S + S (1)
S-> 1 + S (2)
S-> 1 + S + S (1)
S-> 1 + 1 + S (2)
S-> 1 + 1 + 1 (2)

a toto definuje následující syntaktický strom:

           S 
          /|\\
         / | \\
        /  |  \\
       S  '+'  S
       |      /|\\
       |     / | \\
      '1'   S '+' S
            |     |
           '1'   '1'

Jestliže pro jisté řetězce v jazyce gramatiky tam být více než jeden rozebrat strom pak gramatika je řekl, aby byl dvojznačná gramatika. Takové gramatiky jdou obvykle nesnadno rozebrat, protože analyzátor nemůže vždy rozhodnout které mluvnické pravidlo to musí platit.

Normální formy

Každý kontext-volná gramatika, která netvoří prázdný řetězec může být transformována do ekvivalentu jednoho z Chomsky normální formy nebo Greibach normální formy. “ekvivalent” tady znamená, že dvě gramatiky tvoří stejný jazyk.

Protože obzvláště jednoduché formy pravidel výroby v Chomsky gramatiky normální formy, tato normální forma má oba teoretické a praktické důsledky. Například, daný kontext-uvolnit gramatiku, jeden může používat Chomsky normální formu budovat polynomial-algoritmus času, který se rozhodne zda daný řetězec je v jazyce reprezentovaném tou gramatikou nebo ne ( CYK algoritmus).

Vlastnosti kontextu-uvolnit jazyky