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.