티스토리 뷰
계속 작성중인 글임.
* 개요
- 리스너, 비지터 동일하게 파싱 트리 노드 순회 위한 메서드는
<룰이름Context> 라는 클래스를 파라메터로 받는다.
- 이 클래스들은
문법 이름이 Hello 라고 가정할때
HelloParser 클래스 아래 static class 로 정의된다.
- 이 클래스들은 ParserRuleContext 클래스를 상속받는다.
* 예제 문법 Hello
grammar Hello;
r : 'hello' myId ;
myId : ID;
ID : [a-z]+ ;
WS : [ \t\r\n]+ -> skip ;
기본 문법에서 myId 룰 추가함.. (child 테스트 하려고..)
* parserRuleContext.getChild()
하위 노드의 룰 컨텍스트를 가져온다
하위 노드가 렉싱룰 또는 텍스트 직접 입력한 경우 TerminalNodeImpl 객체가 반환된다.
- 위 예제에서 룰 'r' 의 getChild(0) 은 언제나 'hello' 이므로 TerminalNodeImpl 이 반환된다.
- getChild(1) 은 MyIdContext 객체가 반환된다.
- getChlid(MyIdContext.class, 0) 은
하위노드 중 myId 인 것 의 첫번째 노드를 가져온다.
TerminalNode 도 사용 가능하다.
(반환값은 RuleContext 가 아닌 파라메터로 지정된 클래스 T 이다)
- ctx.룰이름() ctx.토큰이름() 이 언제나 생성되므로 혼동되는 경우 아니라면
ctx.myId() 로 호출하는 것과 동일함.
* parserRuleContext.getPayload() - 컨텍스트 반환?
Object 반환하기로 되어 있는데, ParserRuleContext 반환함
* parserRuleContext.getTokens()
저 위에서 <10> 이 있었잖아?
그럼 getTokens(10) 하면 해당 토큰이 나와
근데 리스트에 하나만 넣어주는데 무슨 의미이지는 모르겠어 ( 다양한 해석 나올때 경우의 수 추가인가?)
다른 숫자는 해도 빈
반환값 : List<TerminalNode>
터미널 노드잖아? 터미널일때만 가능
* getRuleIndex()
* parserRuleContext.toString()
[67 43 24]
현재가 67이며 부모 노드에 대한 정보인듯
(getParent() 하면 [43 24] 만 나와 )
* TokenStream
ex) sp = 100 ;
- TokenStream
sp |
= |
100 |
; |
- CharStream
s |
p |
= |
1 |
0 |
0 |
; |
책 p.20
* Token 클래스
- 입력된 문서는 렉서에 의해 토큰으로 나뉘어짐
- hello abc 를 입력했다면
'hello' 와 'abc'(렉싱 룰 ID 에 의해 인식)는 독립적인 토큰이 됨
- toString() 시 다음과 같이 표시
[@21,65:66='토큰',<10>,7:1]
@21, : 해당 토큰은 토큰 중 21번째
65:66 : Char 위치상 65열~66열
='토큰' : 토큰 String
,<10> : 토큰의 타입이 10
,7:1 : 7번째 라인, 문자위치 1
- 현재 컨텍스트의 시작 토큰은 ctx.getStart(),
마지막 토큰은 ctx.getStop() 로 가져올 수 있음
- 책 p.31
* 예제] 앞 부분이 유동적인 경우, 바로 뒤의 단어 가져오기
rA : '-'? Word
;
// 렉싱룰
Word : [a-z]+;
위와 같은 룰이 있을때 '-' 는 있을 수도 있고, 없을 수도 있음.
항상 Word 부분을 가지고 오고 싶다면,
getChlid(0) 불가능하다
왜냐하면 '-abc' 란 단어도 룰에 맞는데,
[0] = '-'
[1] = 'abc'
이기 때문
rA : '-'? rB
;
rB : Word
;
getChild(RBContext.class, 0) 으로 가져와야 함
'SW개발 > ANTLR' 카테고리의 다른 글
java.lang.NoClassDefFoundError: org/antlr/v4/runtime/TokenSource (0) | 2018.08.01 |
---|---|
언어 개발용 프로젝트를 따로 분리해서 사용하기 (0) | 2018.07.30 |
listener 사용 (0) | 2018.07.27 |
Listener , Visitor 비교 (0) | 2018.07.27 |
ANTLRInputsream DEPRECATED (0) | 2018.06.16 |