2017-04-13 1 views
0

저는 컴파일러를 만들려고하고 있으며, 이제는 파서를 만들려고합니다. 나는이 상태에 대한 경고를 얻을 : 주를 89shift/reduse 경고를 제거하는 방법은 무엇입니까?

62 expr: '(' expr . ')' 
    66  | expr . '+' expr 
    67  | expr . '-' expr 
    68  | expr . '*' expr 
    69  | expr . '/' expr 
    70  | expr . '%' expr 
    74  | expr . '&' expr 
    75  | expr . '|' expr 
    77 cond: expr . 
    78  | '(' expr . ')' 
    82  | expr . '=' expr 
    83  | expr . "<>" expr 
    84  | expr . '<' expr 
    85  | expr . '>' expr 
    86  | expr . ">=" expr 
    87  | expr . "<=" expr 

    "<>" shift, and go to state 91 
    ">=" shift, and go to state 92 
    "<=" shift, and go to state 93 
    '+' shift, and go to state 94 
    '-' shift, and go to state 95 
    '|' shift, and go to state 96 
    '*' shift, and go to state 97 
    '/' shift, and go to state 98 
    '%' shift, and go to state 99 
    '&' shift, and go to state 100 
    '=' shift, and go to state 101 
    '<' shift, and go to state 102 
    '>' shift, and go to state 103 
    ')' shift, and go to state 119 


$default reduce using rule 77 (cond) 


State 119 

    62 expr: '(' expr ')' . 
    78 cond: '(' expr ')' . 

    "and"  reduce using rule 62 (expr) 
    "and"  [reduce using rule 78 (cond)] 
    "or"  reduce using rule 62 (expr) 
    "or"  [reduce using rule 78 (cond)] 
    ':'  reduce using rule 62 (expr) 
    ':'  [reduce using rule 78 (cond)] 
    ')'  reduce using rule 62 (expr) 
    ')'  [reduce using rule 78 (cond)] 
    $default reduce using rule 62 (expr) 

이 부분에 대한 나의 문법은 다음과 같습니다

expr: 
    T_const | 
    T_char_const | 
    l_value | 
    '(' expr ')' | 
    func_call | 
    '+' expr | 
    '-' expr | 
    expr '+' expr | 
    expr '-' expr | 
    expr '*' expr | 
    expr '/' expr | 
    expr '%' expr | 
    T_true | T_false | 
    '!' expr | 
    expr '&' expr | 
    expr '|' expr 
; 

cond: 
    '(' cond ')' | 
    expr | 
    T_not cond | 
    cond T_and cond | 
    cond T_or cond | 
    expr '=' expr | 
    expr T_not_equal expr | 
    expr '<' expr | 
    expr '>' expr | 
    expr T_greater_equal expr | 
    expr T_less_equal expr 
; 

여기서 문제가 무엇이며 내가 아마 고칠 수있는 방법 이미 고정이? 일부 교대/문제를 줄이기는하지만 일반적으로이 문제가 무엇인지 이해하지 못했습니다. 당신에게

+0

주 끝에서 두 줄을 깜박입니다. ') [규칙 77 (조건)을 사용하여 줄이기] 규칙 77 (조건)을 사용하여 $ 줄입니다. – Nwlis

+1

[편집]을 사용하여 게시물을 편집하십시오. –

답변

1

질문 인용 문법은 생산이 대단히 감사합니다 : 다른 불일치

cond: '(' expr ')' 

있습니다

cond: '(' cond ')' 

그러나 출력 파일에서 인용 한 생산이있다 이는 출력 파일이 인용 된 문법에서 생성되지 않았 음을 분명하게합니다. 문제의 근본 원인은 두 경우 모두 같지만 질문에 답하는 작업이 복잡해집니다. 나는 대답의 나머지에 대한 참조로 출력 파일을 사용하고 있습니다.

당신은 또한 가지고 있기 때문에하십시오 cond는 괄호 문자열을 유도하는 어떤 상황에 모호성이

cond: expr 

. (충돌은 꽤 명확 주 119 쇼 표시.) 가정, 예를 들어, 파서는 발생

not (x) 
x은 ( l_value 통해) expr로 줄일 ​​수 있지만, 다음 두 가지 가능성이있다 할 수

:

not (expr) => not expr [ from expr: (expr) ] 
      => not cond [ from cond: expr ] 
not (expr) => not cond [ from cond: (eχpr) ] 

이 모호성은 cond이 허용되는 모든 상황에 존재합니다.

구문으로을 부울 및 부울이 아닌 표현으로 나누는 것은 까다 롭고 대개 불필요합니다. 결국 모든 표현식을 부울 (cond: expr)으로 사용할 수 있으며 변수에 부울 값을 할당 할 수 있습니다 (또는 사용자가 허용 할 것으로 기대할 가능성이 높습니다). 그래서 가장 쉽고 가장 보편적 인 해결책은 값이 값이고 표현식이 특수 케이싱 불린이없는 표현이라고 말하는 것입니다.

두 구문을 구별해야 할 필요가 있다면 this recent question에서 예를 찾을 수 있습니다.

관련 문제