나는 토큰을 선언했다 <VOTE>
. 이 토큰을 사용하여 중괄호로 구분 된 블록 내부에서 일치시키고 싶습니다. 블록 밖으로 나오면 건너 뛰고 싶어요. 현재 토큰은 블록 내부에 있든 외부에 있든 상관없이 동일하게 일치하므로 블록 외부의 내용을 구문 분석하는 데 문제가 있습니다.
TOKEN: { < VOTE: " vote" > }
TOKEN: { < #STRING_LITERAL: ["a" - "z", "A" - "Z", "0" - "9", ".", "_", "-", "!","`", "*", "@", "#", "$", "%", ":", "[", "]", "\"", "^", ";", "\\", "<", ">", "/", ",", "?", "=", "&","(",")","+","|"] >}
TOKEN: { < DATA: < STRING_LITERAL > ( < STRING_LITERAL > ) * >
| < OPEN_BRACE: "{" >
| < CLOSE_BRACE: "}" >}
**Production:**
void test():{}
{
(<OPEN_BRACE>
<VOTE>{System.out.println("Voted");}
<CLOSE_BRACE>)
|
<DATA>{System.out.println("Skipped"+token.image);}
}
위의 생산은 블록에 대해 작동합니다.
hi i am { vote }
그러나 다음 블록에 대한 예외가 발생합니다.
hi i vote am { vote }
"투표"가 중괄호 밖에 있기 때문입니다. 중괄호 밖의 "투표"를 건너 뛰는 방법을 알려주세요.
이렇게 <VOTE>
제작에서 언급 할 수 있습니다
void test():{}
{
(<OPEN_BRACE>
<VOTE>{System.out.println("VOted");}
<CLOSE_BRACE>)
|
(<DATA>|<VOTE>){System.out.println("Skipped"+token.image);}
}
하지만 토큰이 많기 때문에이 작업을하고 싶지 않기 때문에이 수정 사항을 풀 스케일 시스템에 적용하면 유지 관리가 어려울 것입니다.
사용해야하는 것은 어휘 상태입니다. 이 내용은 FAQ 및 문서에서 다루며, 관련 부분을 읽어야합니다.
기본적으로 원하는 것은 다음과 같습니다.
<DEFAULT> TOKEN:{
< #STRING_LITERAL: ["a" - "z", "A" - "Z", "0" - "9", ".", "_", "-", "!","`", "*", "@", "#", "$", "%", ":", "[", "]", "\"", "^", ";", "\\", "<", ">", "/", ",", "?", "=", "&","(",")","+","|"] >
| < DATA: < STRING_LITERAL > ( < STRING_LITERAL > ) * > }
<DEFAULT, INBRACES> TOKEN : {
< OPEN_BRACE: "{" > : INBRACES
| < CLOSE_BRACE: "}" > : DEFAULT }
<INBRACES> TOKEN: {
< VOTE: "vote" > }
<DEFAULT, INBRACES> SKIP { " " | "\r" | "\n" }
이제 중괄호 사이에서 "vote"는 VOTE가되지만 외부에서는 DATA가됩니다. 중괄호와 공백은 위치에 관계없이 동일하게 취급됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다