2012-04-24 4 views
0

저는 ANTLR의 초보자이며 애매한 언어를위한 파서를 개발하는 데 사용합니다. 내가하고 싶은 것은 AST를 사용하지 않고 "주석"주위의 토큰을 하나의 토큰으로 결합하는 방법입니다.ANTLR에서 주석 주위에 토큰을 결합하는 방법

나는 문제 이제 우리는 간단한 텍스트 "테스트 {댓글} 어"두 개의 토큰이 생성됩니다 즉, "테스트"와 "어"로 그것을 실행하면

grammar test; 

query 
    :  expression+ 
    ; 

expression 
    : alpha 
    ; 


alpha 
    : ID 
    ; 


ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 
    ; 


COMMENT 
    : '{' (options {greedy=false;} : .)* '}' {$channel=HIDDEN;} 
    ; 

에게 설명하기 위해이 간단한 문법을 ​​사용하고 있습니다 . 반면에 하나의 토큰을 만들고 싶습니다. 어떤 도움을 많이 주시면 감사하겠습니다. 사전에

덕분에

+1

이런 방식으로 작업하면 아마도 사전 처리가 필요할 것입니다. LL/LR 파서는 모호한 언어 인 btw를 처리하도록 설계되지 않았으므로 향후 몇 가지 어려운 문제에 직면 할 수도 있습니다. – ricochet1k

+0

여기에 게시 : http://antlr.markmail.org/message/nvtzsu6zoh4b3pr4 –

답변

0

나는 잘 모르겠지만, 당신이 그런 짓을하는 것을 시도했다 :

에지고, 토큰은 렉서에 의해 처리하는 방법
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* COMMENT? ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 
; 
+0

그래,하지만 토큰의 일부가 될거야. 나는 그것을 실제로 원하지 않는다. –

+0

@Bart,이 규칙의 한 가지 작동 형식은 입니다. ID : ('' '' 'z'| 'A'.. 'Z'| '_') COMMENT?) *; 하지만 실제로는 원하지 않는 ID에 댓글이 포함됩니다. 언어 사양에 따라 어떤 단일 단어/키워드의 알파벳 사이에 코멘트를 넣을 수 있으므로 나중에 규칙에서 인식되는 단어를 얻으려면 주석을 제거해야합니다. –

관련 문제