ANTLR:gramatika pre zoznam (alebo moje prvé pokusy s ANTLR)
Z Java.betlista.net
Táto stránka ešte nie je úplne dokončená
Predstavte si, že potrebujete konfiguračný súbor, v ktorom riadky sú zoznamy v tvare (formát som zvolil podobný tomu ako keď program vypisuje aké parametre prijíma, položky v hranatých zátvorkách sú nepovinné)
položka [, položka [...]]
čo inak povedané znamená, že zoznam pozostáva z rôzneho počtu položiek oddelených čiarkami. Áno, niektorý sa práve chytili za hlavu a hovoria si: "A k tomu potrebujem niečo nové? Veď by som si vystačil aj s jednoduchým regulárnym výrazom", ja doplním, že to bude niečo ako (zatiaľ predpokladajme, že pred čiarkou nie je medzera a po čiarke je medzera práve jedna):
"[^ ]+ (', '[^ ]*)*"
Vážení, jednoduchý príklad má jednoduché použitie a viac srávnych riešení ako niečo zložité (vtedy sme typicky radi, že máme aspoň nejaké správne riešenie). Každopádne regulárny výraz mi povie len to, či vstup match'uje na výraz, alebo nie a zistenie toho, čo je vlastne zle nemusí byť jednoduché, predstavte si, že chcete, aby sme uživateľovi oznámili ak mu niekde v zozname chýba čiarka, ba čo viac, ak mu chýba čiariek viac, tak mu chcete oznámiť všetky chyby naraz...
Niekto už možno začína tušiť, že to asi nebude žiadna trivialita, niekto si možno vraví "budem to spracovávať znak po znaku a nejak to dopadne..." NIE, okrem toho, že toto riešenie nie je vôbec elegantné, tak je náchylné k chybám, to po prvé a tiež nie je ľahko rozšíriteľné, čo je nemálo dôležitá vlastnosť programu (kto už niečo tvoril na zakázku chápe).
Na vyriešenie vyššie popísaného problému použijem ANTLR (ANother Tool for Language Recognition), v ktorom nadefinujem gramatiku pomocou ktorej budem riadky parsovať. Prvý nástrel by mohol vyzerať napríklad takto:
grammar List_first;
/* PARSER */
file: list* ;
list: item (',' ' ' item)* '\r'?'\n';
item: ( ITEM_CHAR )+ ;
/* LEXER */
ITEM_CHAR: ('a'..'z')|('A'..'Z')|('0'..'9') ;
Na "hranie" sa s ANTLR vrelo odporúčam ANTLRWorks, je to v podstate IDE na tvorbu gramatík pre ANTLR. Gramatiky sa v ňom dajú aj testovať (teda kým to až príliš nepreviažete s Javou, teda programom, ktorý píšete.)
Pre vstup:
abc def, ghijkl


