2012-11-12 2 views
1

나는 지금 ANTLR을 배우고 있습니다. 예를 들어, VHDL 코드가 있고 PROCESS 블록에서 일부 처리를 수행하려고합니다. 나머지는 완전히 무시해야합니다. 저는 프로세스 블록에만 관심이 있기 때문에 전체 VHDL 언어를 설명하고 싶지는 않습니다. 그래서 프로세스 블록과 일치하는 규칙을 작성할 수 있습니다. 하지만 ANTLR에 프로세스 블록 규칙 만 일치시키고 다른 것을 무시하도록 지시하려면 어떻게해야합니까?ANTLR : 방해물 제거

답변

3

내가 더 VHDL 옆에 알고, 그래서 당신이 다중 회선와 (자바) 소스 파일의 모든 한 줄 의견을 교환하고 싶은 말은하자가 코멘트 :

//foo 

이 될해야합니다

/* foo */ 

물론 렉서가 한 줄 주석과 일치하도록해야합니다. 문자열 리터럴에 간다

/* 
//bar 
*/ 

같은 :

String s = "no // comment"; 

하지만 당신은 확실히 당신이 //bar는 단일 라인 주석으로 인식하지 않기 때문에 여러 줄의 댓글을 인식해야한다 마지막으로, 임의의 문자와 일치하는 렉서에서 일종의 포괄 규칙을 만들어야합니다.

빠른 데모 :

grammar T; 

parse 
: (t=. {System.out.print($t.text);})* EOF 
; 

Str 
: '"' ('\\' . | ~('\\' | '"'))* '"' 
; 

MLComment 
: '/*' .* '*/' 
; 

SLComment 
: '//' ~('\r' | '\n')* 
    { 
    setText("/* " + getText().substring(2) + " */"); 
    } 
; 

Any 
: . // fall through rule, matches any character 
; 

것은 지금과 같이 입력을 구문 분석하는 경우 : 다음은 콘솔로 인쇄됩니다

//comment 1 
class Foo { 

    //comment 2 

    /* 
    * not // a comment 
    */ 
    String s = "not // a // comment"; //comment 3 
} 

:

/* comment 1 */ 
class Foo { 

    /* comment 2 */ 

    /* 
    * not // a comment 
    */ 
    String s = "not // a // comment"; /* comment 3 */ 
} 

참고이 있음 간단한 데모 : Java의 문자열 리터럴에 유니 코드 이스케이프가 포함될 수 있습니다. 데모에서는 지원하지 않으며 데모는 또한 문자 리터럴을 처리하지 않습니다 (문자 리터럴 char c = '"';은이를 깨뜨릴 것입니다). 물론이 모든 것들은 수정하기가 쉽습니다.

+0

을 당신은 환영 @Andy이야. –

+0

고마워요 @ 바트. "Any"규칙과 일치하는 ANTLR 데이터로 캡처하는 것이 가능한지 궁금합니다. 두 개의 SLComment 토큰 사이에있는 모든 텍스트를 캡처하고 싶습니다. 어떻게 가능합니까? – user1552175