2010-01-17 4 views
5

텍스트의 모든 토큰을 선택하려고합니다. 모든 Ascii 및 Unicode 문자와 일치해야하므로 여기에 어떻게 배치 했습니까? 나는 'A' "의사 결정과 같은 입력을 일치시킬 수 있습니다"얻을antlr의 유니 코드 문자와 일치하는 방법

TOKEN : (CHAR|DIGIT|UNICODE)+; 

.. 'Z' "사용하여 여러 대안 : 1, 3 을 이제 나는 내 토큰 규칙을 작성하는 경우

fragment CHAR  : ('A'..'Z') | ('a'..'z'); 
fragment DIGIT : ('0'..'9'); 
fragment UNICODE : '\u0000'..'\u00FF'; 

결과적으로 해당 입력에 대해 대체 입력 3이 비활성화되었습니다. " "의사 결정은 여러 대안을 사용하여 " '0'.. '9'"와 같은 입력을 일치시킬 수 있습니다. 2, 3 결과적으로 대체 (들) 3 해당 입력에 대해 사용 중지되었습니다. "

일치하는 항목 없음 : 또한 쓰는 경우

TOKEN : (UNICODE)+; 

일치하는 내용이 없습니다.

이렇게하는 방법이 있습니까?

+3

'\의 u0000의를'.. '\ u00FF는'그것은 단지 "모든 유니 코드 문자"적용되지 않습니다 첫번째 256을 다룬다. –

+0

그것도. 나는 그것을 놓쳤다! –

+0

사실,하지만 자바가 아직 5 자리 유니 코드를 지원하지 않는다고 생각했습니다. – Lezan

답변

5
유니 코드 당신이 말할 수있는 charvocabulary 옵션을 설정해야한다는 것입니다 사용에 계획하는 경우 또 한가지 고려해야 할

당신이 FFFE

options 
{ 
charVocabulary='\u0000'..'\uFFFE'; 
} 

당신은 일반적으로 예에서 볼 수 기본값을 통해 0의 유니 코드 범위의 모든 문자를 허용하려는 것은

options 
{ 
charVocabulary = '\3'..'\377'; 
} 
입니다

위의 사항을 설명합니다. 당신이 ASCII 문자 범위 'A'..'Z'과 같은 유니 코드 렉서 규칙을 만들 것 유니 코드 범위를 모두 필요로 일반적으로 경우 : '\u0080'..'\ufffe'

+1

참고 : "charVocabulary"옵션은 antlr3에서 기본적으로 유니 코드를 사용하므로 사용할 수 없습니다. –

5

실제로 말하면, TOKEN: (UNICODE)+은 완전히 쓸모가 없습니다.

모든 것이 토큰 문자이므로 Java 프로그램과 일치시키기 위해 이러한 규칙을 사용하려고하면 간단히 전체 프로그램과 일치하여 하나의 큰 토큰으로 반환됩니다.

입력을 의미있는 조각으로 나누려면 문자를 다른 그룹으로 나누어야합니다.

"전문가"가 어떻게했는지 살펴 보는 것이 도움이 될 수 있습니다. 여기에 그들이 밖으로

그룹에 문제에 걸린 보여주는, a BNF grammar for Java이며, 여기 BNF for an identifier입니다
identifier 
    ::= "a..z,$,_" { "a..z,$,_,0..9,unicode character over 00C0" } 
관련 문제