Difference between revisions of "Antlr"

From no name for this wiki
Jump to: navigation, search
(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]

Resourcen