2012-01-31 2 views
1

일부 단어가 포함 된 토큰을 설명해야합니다. 단어에는 영어 문자 및 기타 특수 기호가 포함될 수 있지만 일부 '{'와 같이} 일부 영어 문자로 시작하면 안됩니다. (예 : 'O')javacc 토큰 일반 표현식 및 _symbol_in

AND_SYMBOL_IN 작업이 필요합니다. JavaCC에 문서에서 찾을 수 을 나는이 같은 행동 뭔가가 필요합니다.? 나는 (아래 같은) 특별한 토큰을 생성 할 수 있습니다

TOKEN : { < LETTERS: (
    (~["O", "-"] AND_SYMBOL_IN ["a"-"z","A"-"Z","-",".","&","|","0"-"9"])? (["a"-"z","A"-"Z","-",".","&","|","0"-"9"])+ 
) > } 

,하지만 나는 그것을 isn`t 더 좋은 결정은,이 생각

TOKEN : { < #LETTEREX: (
["a"-"z","A"-"N","P"-"Z",".","&","|","0"-"9","-"]) > } 

TOKEN : { < LETTERS: (
(<LETTEREX>) (<LETTEREX> | ["O"])+ 
) > } 
+0

인터넷에는 'AND_SYMBOL_IN'을 설명하는 문서가없는 것 같습니다. 따라서 JavaCC에 대한 개인적인 지식이 없으면 우리는 당신을 도울 수 없습니다. – Borodin

+0

토큰 인식에서 regexp를 반복적으로 반복하기를 원한다면 '더 낫다'는 (즉, 더 간결한) 해결책이있을 것입니다. 나는 누구도 그 렉서 제너레이터를 위해 일반적으로 그 기능을 구현하는 번거 로움을 겪지 않았다고 믿는다. 유니 코드 컨텍스트에서 일부 고유 한 요구 사항이 바람직 할 수도 있지만 귀하의 솔루션에 집착하는 것이 좋습니다. 또 다른 옵션은 TOKEN_FACTORY를 설정하고 'newToken'을 조정하여 '단어'와 일치 할 때 다른 토큰을 반환하는 것입니다. javacc 문서를 참조하십시오. 도움이되는 희망, 안부 – collapsar

답변

2

JavaCC는 ambigu를 해결합니다. 일치하는 토큰이 문법에서 선언 된 순서를 사용하여 동일한 크기의 일치 사이를 반복합니다. 그래서 하나의 가능성은 당신이 토큰 앞에 원하지 않는 토큰을 일치하는 것입니다 당신이 할 : 예를 들어

: 얼마나 많은 특별한 당신이 경우 어떻게 복잡한 그들이에 따라 달라 적합 이것이

TOKEN : { < #LETTER : ["a"-"z","A"-"Z","-",".","&","|","0"-"9"] > } 
TOKEN : { < WORDS_STARTING_WITH_O : "O" (<LETTER>)+ > } 
TOKEN : { < WORDS_NOT_STARTING_WITH_O : (<LETTER>)+ > } 

.