method_call: T_ID T_LPAREN method_arg_list T_RPAREN T_SEMICOLON
value: T_ID T_LSB expr T_RSB
| T_ID;
method_arg_list: /* Empty */
| method_arg method_arg_list;
method_arg: string_constant
| expr;
expr: value
| '(' expr ')';
에 따라함에 따라 충돌이 문법에 충돌을 감소 문제는이 T_ID을 읽을 때, 그것은 이동 및 다음 '을 읽어야 여부를 알 수 없다는 것입니다 ('또는 값을 줄입니다. 그러나 다음 토큰이 왼쪽 괄호인지 확인하면 안됩니다.)
나는 바이슨과 파서가 일반적으로 새롭기 때문에 내가 어떻게 다시 작성할 수 있는지 궁금하다. 문법과 충돌을 해결할 수 있습니까?
State 60
37 method_call: T_ID . T_LPAREN method_arg_list T_RPAREN T_SEMICOLON
67 value: T_ID . T_LSB expr T_RSB
68 | T_ID .
T_LPAREN shift, and go to state 71
T_LSB shift, and go to state 72
T_LPAREN [reduce using rule 68 (value)]
$default reduce using rule 68 (value)
Google에서 귀하를 도울 수있는 정보가 충분하지 않습니다. 오류를 재현하는 MCVE ([MCVE])를 생성해야합니다. 일부 토큰을 나열합니다 (실제 문법에서는 비 터미널 임에도 불구하고 일부 비 터미널을 토큰으로 나열 할 수 있습니다). 'yacc -v' ('bison -v')의 출력에서 문제가있는 상태에 대한 shift/reduce 충돌 보고서를 보여줍니다. 문제를 재현 할 수있을만큼 충분한 문법이 필요합니다. 그러나 문제를 재현 할 수있을만큼 충분하지는 않습니다. –
@JonathanLeffler 내가 몇 가지를 변경 한 후에 오류가 사라졌다 ... 나는 아직도 무슨 일이 있었는지 알아 내려고 노력 중이다. – GalaxyVintage
''(''은'T_LPAREN'과'')이어야하는지 잘 모르겠다. '는'T_RPAREN'이어야합니다. 쓰여진 것처럼'% token T_ID T_LPAREN T_RPAREN T_SEMICOLON T_LSB T_RSB string_constant' 그리고 Bison은 코드에서 괜찮습니다. 나는 당신이 파산 한 것을 기록하고 그 후에 작동하는 것을 희망합니다. 버전 제어 시스템을 사용하는 것이 매우 중요합니다. –