Difference between revisions of "Antlr"
(→Hello World) |
(→Kleiner Rechner) |
||
Line 68: | Line 68: | ||
INT : '0'..'9'+; | INT : '0'..'9'+; | ||
+ | </source> | ||
+ | |||
+ | Programm: | ||
+ | |||
+ | <source lang="java5"> | ||
+ | ANTLRStringStream st = new ANTLRStringStream("8+9"); | ||
+ | SimpleCalcLexer lex = new SimpleCalcLexer(st); | ||
+ | CommonTokenStream tokens = new CommonTokenStream(lex); | ||
+ | SimpleCalcParser parser = new SimpleCalcParser(tokens); | ||
+ | int result = parser.program(); //resultat ist 17 | ||
</source> | </source> | ||
Revision as of 16:41, 29 July 2010
Hello World
Generieren einer einfachen Sprache.
Das File SimpleCalc.g:
grammar SimpleCalc;
tokens {
PLUS = '+' ;
MINUS = '-' ;
MULT = '*' ;
DIV = '/' ;
}
@members {
public static void main(String[] args) throws Exception {
ANTLRStringStream st = new ANTLRStringStream("123+123");
SimpleCalcLexer lex = new SimpleCalcLexer(st);
CommonTokenStream tokens = new CommonTokenStream(lex);
SimpleCalcParser parser = new SimpleCalcParser(tokens);
parser.expr();
}
}
/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/
expr : term ( ( PLUS | MINUS ) term )* ;
term : factor ( ( MULT | DIV ) factor )* ;
factor : NUMBER ;
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
NUMBER : (DIGIT)+ ;
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; } ;
fragment DIGIT : '0'..'9' ;
Der Lexer und Parser werden so generiert:
C:\Users\Claude Glauser\Downloads\antlr>java -cp antlr-3.2.jar org.antlr.Tool SimpleCalc.g
Es werden die Java-Dateien SimpleCalcLexer.java und SimpleCalcParser.java generiert.
Kleiner Rechner
grammar SimpleCalc;
program returns [int result]:
x=INT {$result = $result + Integer.parseInt($x.text);}
'+'
y=INT {
$result = $result + Integer.parseInt($y.text);
System.out.println($result);
};
INT : '0'..'9'+;
Programm:
ANTLRStringStream st = new ANTLRStringStream("8+9");
SimpleCalcLexer lex = new SimpleCalcLexer(st);
CommonTokenStream tokens = new CommonTokenStream(lex);
SimpleCalcParser parser = new SimpleCalcParser(tokens);
int result = parser.program(); //resultat ist 17
Lexer brauchen
ANTLRStringStream st = new ANTLRStringStream("123+123");
SimpleCalcLexer lex = new SimpleCalcLexer(st);
CommonTokenStream tokens = new CommonTokenStream(lex);
List<CommonToken> tokenList = tokens.getTokens(); //org.antlr.runtime.CommonToken
for(CommonToken token : tokenList)
{
System.out.println(token);
}
Der Output ist:
[@0,0:2='123',<8>,1:0] [@1,3:3='+',<4>,1:3] [@2,4:6='123',<8>,1:4]