Vstupná gramatika je textový súbor (obvykle s príponou .grm, nemusí byť), ktorého syntax je popísaná v nasledujúcich riadkoch. Analyzátor tohto súboru rozlišuje veľké a malé písmená (case sensitive), čiže Id <> ID <> id. Komentár je označený ! - všetko za týmto znakom, až po koniec riadku je komentár a nemá to vplyv na gramatiku.

 

Celkovo sa dá rozdeliť na 8 častí (nemusia nasledovať v uvedenom poradí, jedine je potrebné aby boli získateľné jedným prechodom zhora nadol všetky tokeny a pod.):

 

 

 

 

 

 

 

 

 

Posledné štyri časti nie sú nevyhnutné, ale ak chceme mať trochu lepšie výsledky porovnávania, resp. krajšie zobrazené výsledky, tak je vhodné ich využiť. V podstate ak by sa v súbore definície gramatiky nachádzala iba časť obsahujúca pravidlá v BNF forme, tak je to tiež platná definícia gramatiky, pre zaujímavosť, najmenšia platná definícia gramatiky má iba 5 znakov <>::= a akceptuje iba prázdne vstupy.

 

Deklarácie premenných

 

v tvare: "meno premennej" = hodnota \/ "meno premennej" = 'hodnota' \/ "meno premennej" = <hodnota>

 

napr.

                "Case Sensitive"     = False

                "Start Symbol"       = <Program>

                "WS Terminal"        = 'WS'

                "COMMENTLINE Terminal" = 'CL'

                "COMMENT1 Terminal" = 'C1'

                "COMMENT2 Terminal" = 'C2'

                "Parse Comments" = True

 

Dôležité premenné sú v nasledujúcej tabuľke.

 

Meno premennej

Prípustné hodnoty

Popis

Case Sensitive

True/False (1/0) [default - false]

určuje či daný jazyk rozlišuje veľké a malé písmená (napr. pre Delphi = false, pre Javu = true)

Start Symbol

meno počiatočného neterminálu

určuje neterminál, ktorým sa začína odvodzovanie

WS Terminal

meno tokenu(terminálu)

určuje token, ktorý obsahuje WS a teda sa ignoruje už v lexikálnom analyzátore

COMMENTLINE Terminal

meno tokenu(terminálu)

určuje token, ktorý popisuje riadkové komentáre

COMMENT1 Terminal

meno tokenu(terminálu)

určuje token, ktorý popisuje klasické komentáre 

COMMENT2 Terminal

meno tokenu(terminálu)

určuje token, ktorý popisuje klasické komentáre

Parse Comments

True/False (1/0) [default - false]

určuje či sa komentáre vkladajú do syntaktického stromu (a následne sa môžu aj porovnávať), alebo nie (ak nie, tak sú ignorované parserom)

 

Zvyšné premenné sú pre fungovanie programu nepodstatné.

 

Deklarácie množín

 

v tvare: {meno množiny} = výraz obsahujúci [implicitná množina] \/ 'text' \/ {meno množiny} \/ operátory +-

 

implicitná množina, napr. [abcdef] je len vymenovanie znakov (môže obsahovať všetky okrem ]) - podobné ako keby sme miesto toho dali text v '', v texte ale nemôžme používať ', jedine cez escape sekvenciu \39, podobne sa dajú písať aj koniec riadku \13\10 a pod.

 

Okrem toho je už preddefinovaných niekoľko množín, ktoré sa dajú využívať na definovanie ďalších:

 

        {Printable} = všetky znaky okrem prvých 32 (t.j. <32-255>)

        {Whitespace} = #9#10#13#32

        {Letter} = [ABCDEFG...XYZabcdefg...xyz]

        {Digit} = [0123456789]

 

napr.

                {Hex Digit}             = {Digit} + [abcdefABCDEF]

                {Id Head}              = {Letter} + [_]

                {Id Tail}                = {Id Head} + {Digit}

 

                {C1N Ch}             = {Printable} - [}]

 

                {C2N Ch}     = {Printable} - [*]

                {C2S Ch}     = {Printable} - [)]

 

                {CLN Ch}     = {Printable} - '\13'

                {CLS Ch}     = {Printable} - '\10'

 

Deklarácia a popis tokenov pomocou regulárnych výrazov

 

v tvare: meno tokenu (terminálu) = regulárny výraz zložený z implicitných množín, textových reťazcov (stringov), množín (!pozor nie iných tokenov!) a operátorov +*?()| 

 

napr.

                HexLiteral       = '$'{Hex Digit}+

                StringLiteral    = '\39'( {String Ch} | '\39' '\39' )* '\39'

                id                  = {Id Head}{Id Tail}*

                CL                 = '//' ({CLN Ch}* | '\13'{CLS Ch})* '\13\10'

                C1                 = '{' {C1N Ch}* '}'

                C2                 = '(*' ({C2N Ch} | ('*')* {C2S Ch})* ('*)' | ('*')+ ')')

 

Pravidlá v BNF forme

 

Backus-Naur forma bola vymyslená ešte koncom 50. rokov minulého storočia, pôvodne na lepšie popísanie Algolu, pri prezentácii v 1958 ju použil Backus, ale ujalo sa to až v roku 1960, keď sa do toho pustil Naur.

 

v tvare: <meno neterminálu> ::= výraz obsahujúci tokeny (terminály) a neterminály ničím neoddelené - iba prázdnym miestom, môže ich byť aj 0, vtedy sa jedná o epsilon pravidlo. Špeciálny operátor | oddeľuje pravú stranu pravidiel s rovnakou ľavou stranou, ak sa | nachádza na novom riadku ako prvý "neprázdny" znak, tak ľavá strana stále zostáva a definujeme ďalšiu pravú stranu

 

napr.

                <Program> ::= <ProgramHeader> <Uses> <Declarations> <CompoundStatement> '.' 

                <VariableDeclarations> ::= VAR <VariableDeclarationList>

                <VariableDeclarationList> ::= <VariableDec>

                                                     | <VariableDec> <VariableDeclarationList>

 

Popis tried ekvivalencie spolu so skóre pre danú triedu

 

v tvare: ^ skóre pre zhodu v type, skóre pre identitu (ak sa neuvedie druhé skóre, tak je zhodné s prvým), zoznam obsahujúci terminály/neterminály oddelené medzerami (ak je tento zoznam prázdny, tak sa nastavuje štandardná hodnota na túto novú hodnotu).

 

napr.

                ^ 3 

                ^ 2 ','

                ^ 6 30 id

 

Popis tried podobností spolu so skóre pre danú triedu

 

v tvare: ~ skóre pre podobnosť v type, zoznam obsahujúci terminály/neterminály oddelené medzerami (ak je tento zoznam prázdny, tak sa nastavuje štandardná hodnota na túto novú hodnotu).

 

napr.

                ~ 0

                ~ 2 <WhileStatement> <ForStatement>

                ~ 2 WHILE FOR

 

Definovanie formátovania kódu (pretty printing)

 

v tvare: & terminál/neterminál (ak je toto miesto prázdne tak definujeme štandardnú hodnotu), počet medzier pred daným terminálom/neterminálom, odsadenie pred daným terminálom/neterminálom, nové riadky pred terminálom/neterminálom, okrem toho keď jeho rodič je z množiny definovanej po týchto hodnotách, tak sa hodnoty neaplikujú, potom nasledujú rovnaké kategória, až na to, že sa aplikujú po danom terminále/neterminále.

 

napr.

                &                            0 0 0                             1 0 0

                & ';'                         0 0 0                             1 0 1 <ArgumentList>

                & <StatementList>     0 2 1                             0-2 0

                & CL                        0 0 0                             0 0 0

 

        Riadok "& <StatementList>     0 2 1                             0-2 0" znamená, že pred každým neterminálom StatementList sa zväčší odsadenie o dva znaky a pridá sa nový riadok, po každom neterminále StatementList sa zmenší odsadenie o dva znaky.

 

Definovanie vyfarbovania syntaxe (syntax highlighting)

 

v tvare: % terminál (ak je toto miesto prázdne tak definujeme štandardnú hodnotu pre syntax highlighting všetkých terminálov), farba pozadia, farba textu, štýl textu (1-tučné,2-kurzíva,4-podčiarknutie,8-preškrtnutie; pre výsledný efekt spočítame požadované zložky).

 

napr.

                %                      8388608  12632256 1

                %DecLiteral         $FF0000  12632256 1

                %HexLiteral         $FF0000  12632256 1

                %FloatLiteral       $FF0000  12632256 1

                %StringLiteral      $FF0000  12632256 1

                %CharLiteral        $FF0000  12632256 1

 

                % id                   0            12632256 0

                % CL                  $008000  12632256 2

                % C1                  $008000  12632256 2

                % C2                  $008000  12632256 2

                % ';'                   16777215 $FF0000 15

 

        Riadok  "% ';'                   16777215 16776960 15" znamená, že každá ; bude zobrazená bielou farbou, v štýle tučné písmo, kurzíva, podčiarknutá, preškrtnutá, pozadie po ňou bude modré (ak používame iba syntax highlighting spolu s pretty printingom, lebo pri porovnávaní stromov a následnom zobrazovaní sa textové pozadie neberie do úvahy, aby zbytočne nebol zmätok na obrazovke.