antlr grammar
grammar E;
@header {
import handler.TokenEventHandler;
}
@members {
private TokenEventHandler handler=new TokenEventHandler(input);
}
stmt
@init {
handler.start(1);
}
@after {
handler.end(1, $start, $stop);
}
: 'do' expr NEWLINE ;
expr
@init {
handler.start(2);
}
@after {
handler.end(2, $start, $stop);
}
: e1=INT
( '+' e2=INT {handler.line(3,$e1, $e2);}
| '-' e2=INT {handler.line(4,$e1, $e2);}
)*
;
INT : '0'..'9'+ ;
NEWLINE: '\r'? '\n' ;
WS : (' '|'\t')+ {skip();} ;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CommonTokenStream;
public class EParserMain {
public static void main(String[] args) throws Exception {
ANTLRStringStream input=new ANTLRStringStream("do 1+2+3 - 4 -5 -6+7 \n");
ELexer lexer = new ELexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
EParser parser = new EParser(tokens);
parser.stmt();
}
}
java test main
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CommonTokenStream;
public class EParserMain {
public static void main(String[] args) throws Exception {
ANTLRStringStream input=new ANTLRStringStream("do 1+2+3 - 4 -5 -6+7 \n");
ELexer lexer = new ELexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
EParser parser = new EParser(tokens);
parser.stmt();
}
}
event handler
package handler;
import org.antlr.runtime.Token;
import org.antlr.runtime.TokenStream;
public class TokenEventHandler {
public static final String Types[]={"noused", "Statement", "Expression", "Add", "Sub"};
private TokenStream tstream;
public static void main(String[] args) {
}
public TokenEventHandler(TokenStream input) {
tstream=input;
}
public void start(int mark) {
System.out.println("START: "+Types[mark]);
}
public void end(int mark, Token t1, Token t2) {
System.out.println("End:"+Types[mark]);
for(int i=t1.getTokenIndex(); i<=t2.getTokenIndex(); i++) {
Token t=tstream.get(i);
System.out.print(t.getText());
}
System.out.println("\n");
}
public void line(int mark, Token ...tokens ) {
System.out.println(Types[mark]+": "+tokens[0].getText()+" and "+tokens[1].getText());
}
}
sample output
START: Statement
START: Expression
Add: 1 and 2
Add: 1 and 3
Sub: 1 and 4
Sub: 1 and 5
Sub: 1 and 6
Add: 1 and 7
End:Expression
1+2+3-4-5-6+7
End:Statement
do1+2+3-4-5-6+7