2012-06-05 3 views
1

나는 대략 이와 비슷한 문법을 ​​정의했다.JavaCC 문법 충돌

TOKEN:{ 
     <T_INT: "int"> | 
     <T_STRING: ["a"-"z"](["a"-"z"])*> 
} 

SKIP: { " " | "\t" | "\n" | "\r" } 

/** Main production. */ 
SimpleNode Start() : {} 
{ 
     (LOOKAHEAD(Declaration()) Declaration() | Function()) 
    { return jjtThis; } 
} 

void Declaration() #Decl: {} 
{ 
     <T_INT> <T_STRING> ";" 
} 

void Function() #Func: {} 
{ 
     <T_STRING> "();" 
} 

이 같은 물건 잘 작동 :

int a; 
foo(); 

하지만 나를 위해 법적 및 기능()에 의해 해석되어야하는, int();을하려고 할 때, 대신 선언에 간다. 이 "충돌"을 어떻게 수정합니까? 나는 다양한 조합을 시도했다.

답변

1

JavaCC FAQ의 섹션은 "How do I deal with keywords that aren't reserved?"입니다.

즉 내가 식별자에 대안 키워드를 허용하고 할 것,

(<T_STRING> | <T_INT>) "();" 

많은 키워드가있을 때, 일반 식별자와 함께, 그들 모두를 허용하는 Identifier 생산을 만들 도움이 될 수 있습니다 토큰.

그런데 "();" 대신 "(" ")" ";"이 필요할 수 있습니다.