2014-04-02 9 views
0
들소

빈 규칙과 오차를 줄이기 : 빈 규칙에 대한시프트 내가 yacc에 문법 아래에있는

OPTIONS:OPTIONS OPTION     {printf("%s\n", "Options enabled");} 
     | OPTION      {printf("%s\n",  "First option");} 
     | 
     ; 

OPTION: DEBUG       {printf("%s\n", "debug enabled");} 
     | NESTING      {printf("%s\n", "nesting enabled");} 
     | '(' STACK '=' NAME ')'  {printf("%s\n", "stack size given");} 
    | NOLIST      {printf("%s\n", "nolist enabled");} 
    | VIEW EQ NAME     {printf("%s\n", "this is a view, first name is view name");} 
    ; 

, 그것은 나를 이동주고있다/오류를 줄일 수 있습니다. 오류 Y. 출력 파일은 다음과 같습니다.

17 OPTIONS: . OPTIONS OPTION 
18  | . OPTION 
19  | . [SEMICOLON, VIEW, DEBUG, NESTING, NOLIST, '('] 
20 OPTION: . DEBUG 
21  | . NESTING 
22  | . '(' STACK '=' NAME ')' 
23  | . NOLIST 
24  | . VIEW EQ NAME 

NAME  shift, and go to state 4 
VIEW  shift, and go to state 11 
DEBUG shift, and go to state 12 
NESTING shift, and go to state 13 
NOLIST shift, and go to state 14 
'('  shift, and go to state 15 

VIEW  [reduce using rule 19 (OPTIONS)] 
DEBUG  [reduce using rule 19 (OPTIONS)] 
NESTING [reduce using rule 19 (OPTIONS)] 
NOLIST [reduce using rule 19 (OPTIONS)] 
'('  [reduce using rule 19 (OPTIONS)] 
$default reduce using rule 19 (OPTIONS) 

누군가가 문제를 해결하는 방법을 제안 할 수 있습니까?

답변

1

OPTIONS 규칙에 대한 재귀가 있습니다. 그 재귀를 멈추게하는 두 가지 방법이 있기 때문에 충돌이 존재합니다. 예를 들어, 단 하나의 옵션 만있는 경우 두 개의 구문 분석 트리가 있습니다.

OPTIONS   or    OPTIONS 
    |        | \ 
OPTION      OPTIONS OPTION 
    |        | 
    ...      "empty rule" 

그래서, 빈 규칙 또는 (빈 규칙을 유지)를 OPTIONS : OPTION를 제거하고 문제가 사라해야합니다.

관련 문제