이 문법은 연산자의 우선 순위를 지정 했음에도 불구하고 충돌을 일으켰습니다. 드래곤 책에서도 그런 방법으로 해결되었지만 (아래의 처음 7 행으로 구현 된 방식) 충돌은 여전히 발생합니다! 다음은 이 yacc를 구현하는 코드입니다Shift yacc의 산술 표현에 대한 충돌 감소.
%right THEN_KW
%right ELSE_KW
%left XOR_KW OR_KW
%right '='
%left AND_KW ALSO_KW
%left EQ_KW LT_KW GT_KW LE_KW GE_KW
%left PLUS_KW MINUS_KW
%left MULT_KW DIV_KW MOD_KW
%right NOT_KW
arthlogicexpr -> operand | arthlogicexpr arthop arthlogicexpr
arthop -> '+' | '-' | '*' | '/' |'%'
operand -> variable
variable -> IDENTIFIER
parser.output의 에로입니다 : 다른 상태에 대한
state 141
78 arthlogicexpr: arthlogicexpr . arthop arthlogicexpr
78 | arthlogicexpr arthop arthlogicexpr .
'+' shift, and go to state 103
'-' shift, and go to state 104
'*' shift, and go to state 105
'/' shift, and go to state 106
'%' shift, and go to state 107
'+' [reduce using rule 78 (arthlogicexpr)]
'-' [reduce using rule 78 (arthlogicexpr)]
'*' [reduce using rule 78 (arthlogicexpr)]
'/' [reduce using rule 78 (arthlogicexpr)]
'%' [reduce using rule 78 (arthlogicexpr)]
$default reduce using rule 78 (arthlogicexpr)
arthop go to state 109
대한 추가 정보 : 당신이 경고를 방지하려면
state 103
79 arthop: '+' .
$default reduce using rule 79 (arthop)
state 104
80 arthop: '-' .
$default reduce using rule 80 (arthop)
state 105
81 arthop: '*' .
$default reduce using rule 81 (arthop)
state 106
82 arthop: '/' .
$default reduce using rule 82 (arthop)
state 107
83 arthop: '%' .
$default reduce using rule 83 (arthop)
가능한 복제 (HTTPS [들소 Shift 키를/C와 같은 언어에 대한 오차를 줄이기] : // 유래합니다. co/questions/19085340/bison-shift-reduce-error-for-c 같은 언어) – rici