2012-10-18 3 views
0

나는 CFG 세트를위한 파서를 작성 중이다. (참고 : RHS는 만 할 수 있습니다 대문자)를 포함하는파싱을위한 Javacc '<UPPER_CASE><ARROW>

/*, 여기이 분명히 어떤 가장자리 케이스를 놓친 */

void 
start(): 
{ 
} 
{ 
    (
    <UPPER_CHAR> 
    <ARROW> 
    <STRING> 
    (<PIPE> <STRING>)* 
    )* 
} 


TOKEN: 
{ 
<ARROW: "=>" > 
| 
<PIPE: "|"> 
| 
<UPPER_CHAR: (["A"-"Z"])> 
} 

TOKEN: {<STRING: (<LETTER> | <DIGIT> | <SYMBOL>)+ > } 

코드의 주요 부분의 선언과 물건을 무시하고 일부 :

A => A | a | D E => e

그래서 내가 잘못 했습니까 뭐?

답변

1

SYMBOL에는 "="및 ">"이 포함되지만 "|"는 포함되지 않습니다. 그럴 경우. STRING은 "D E => e"전체와 일치합니다.

왜 STRING을 원하십니까? 왜 이런 식으로하지 마십시오.

void start() : {} { 
    (
     <UPPER_CHAR> <ARROW> 
     choices() 
    )* 
} 
void choices() : {} { 
     choice() (<PIPE> choice())* 
} 
void choice() : {} { 
    LOOKAHEAD(<UPPER_CHAR> <ARROW>) 
    {} 
| 
    (<UPPER_CHAR> | <LOWER_CHAR>) choice() 
| 
    {} 
} 

내가 choice 재귀를 사용하는 이유는 루프를 종료 구문 내다을 사용 할 수있는 방법이 없다는 것입니다. 나는. 원하는 것은 (<UPPER_CHAR> | <LOWER_CHAR>)*이지만 다음 두 개의 토큰이 <UPPER_CHAR> <ARROW>이 되 자마자이 루프에서 빠져 나가고 싶습니다.