티스토리 뷰

SW개발/ANTLR

listener 사용

개소왕 2018. 7. 27. 22:45

* 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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함