| Refresh | Home EGTry.com

token events. rule start, rule end, sub rule sequence


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