Sisendfailis on igal real kas täisarvudega opereeriv aritmeetiline avaldis või sellise avaldise omistamine muutujale (väärtustatud muutujat võib järgnevates avaldistes juba kasutada. Sellise sisendi süntaksi võib kirjeldada näiteks grammatikaga:
avaldyksl | avald + yksl
| avald - yksl yksltegur | yksl * tegur | RV tegur
ARV |ID ARV
('0'..'9')+ ID
('a'..'z'|'A'..'Z')+ RV
('\r''\n'|'\n'|'\t')
Antlr3 jaoks tuleb see sisendit kirjeldav grammatika (koos Javas kirjeldatud semantilise tegevusega, mis väljastab süntakstiliselt korrektse avaldise puhul avaldise teksti ja selle järel - OK) esitada kujul:
grammar avald;
tokens {
PLUS = '+' ;
MINUS = '-' ;
MULT = '*' ;
DIV = '/' ;
}
@members { /* peaprogramm ! */
public static void main(String[] args) throws Exception {
/*avaldLexer lex = new avaldLexer(new ANTLRFileStream(args[0]));*/
ANTLRInputStream input = new ANTLRInputStream(System.in);
avaldLexer lex = new avaldLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lex);
avaldParser parser = new avaldParser(tokens);
try {
parser.avald();
} catch (RecognitionException e) {
e.printStackTrace();
}
}
}
/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/
avald : yksl ( ( PLUS | MINUS ) yksl)*
{System.out.println($avald.text + " - OK");}
;
yksl : tegur ( ( MULT | DIV ) tegur )* ;
tegur : ARV ;
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
ARV : NUM('.'NUM)? ;
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; } ;
fragment NUM : ('0'..'9')+ ;
Grammatikafail algab grammatika nimega grammar avald ja see nimi peab kokku langema faili nimega, milles grammatika salvestatakse, see ga see grammatika tuleb salvestada failis avald.g ((.g - grammar - Antlr-i tavalaiend). Kui see fail avada silumiseks programmis ANTLRWorks, saab kontrollida kogu grammatika korrektsust ("Grammar - Check Grammar"), vaadelda produktsioonide vooskeeme.
Võib käivitada ka grammatika interpretaatori ja kui interpretaatorile anda mingi sisend, siis saab vaadelda sisendi analüüsiks konstrueeritud derivatsioonipuud ja selle debuggeris samm-sammult läbida.
javac *.javaLoome ka testfaili, kus on näiteks selline avadis:
2+3*4Käivitame loodud süntaksikontrolleri, andes talle sisendiks selle faili (see peab UltraEdit-is olema aktiivses aknas):
java avaldParser < %fTulemuseks saame
2+3*4 - OK
public static int i; static double rarv = 3.1415; public boolean result = true; private char capitalC = 'C';
©2004
Jaak Henno