티스토리 뷰

SW개발/ANTLR

작성중 / ParserRuleContext

개소왕 2018. 7. 27. 23:05

계속 작성중인 글임.



* 개요 


- 리스너, 비지터 동일하게 파싱 트리 노드 순회 위한 메서드는 


<룰이름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 


책 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) 으로 가져와야 함



공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함