티스토리 뷰
* Visitor 와 동일한 예제 사용 (Hello)
http://dogcowking.tistory.com/186
* 리스너 정의
- VIsitor 와 마찬가지로
인터페이스 HelloListener 와
이를 구현한 HelloBaseListener 가 자동 생성됨.
이를 활용하기 위한 HelloMyListener 를 다음과 같이 정의해보면...
public class HelloMyListener extends HelloBaseListener {
@Override public void enterR(@NotNull HelloParser.RContext ctx) { }
@Override public void exitR(@NotNull HelloParser.RContext ctx) { }
// ... 다른 룰 생략
}
- 별도의 메서드를 구현할 필요는 없지만,
enter룰이름()
exit룰이름() 를 오버라이드 할 수 있음.
(당연히 얼터너티브 선언시 얼터너티브 이름으로...)
- 모든 룰에서 호출되는
enterEveryRule(), exitEveryRule() 있음.
- visitTerminal(), visitErrorNode() 도 있음..
(모두 비지터에는 없었던 것들.)
- visitor 와 달리 visitChildren() 같은건 선언하지 않아도 됨
* 리스너 활용 코드
// 파스 트리 생성
String s = "hello abc";
HelloLexer lex = new HelloLexer(CharStreams.fromString(s));
CommonTokenStream cts = new CommonTokenStream(lex);
HelloParser par = new HelloParser(cts);
ParseTree pt = par.r();
// 리스너 연결
ParseTreeWalker walker = new ParseTreeWalker();
HelloMyListener listener = new HelloMyListener();
walker.walk(listener, pt);
- 비지터는 비지터 객체 1개만으로 순회가 가능했지만
리스너는 ParseTreeWalker 를 별도로 생성하여 노드 순회에 활용함.
'SW개발 > ANTLR' 카테고리의 다른 글
언어 개발용 프로젝트를 따로 분리해서 사용하기 (0) | 2018.07.30 |
---|---|
작성중 / ParserRuleContext (0) | 2018.07.27 |
Listener , Visitor 비교 (0) | 2018.07.27 |
ANTLRInputsream DEPRECATED (0) | 2018.06.16 |
visitor 사용 (0) | 2018.05.30 |