다음은 내 문제를 설명하는 Bison 문법입니다. 실제로 사용하는 문법은 더 복잡합니다. 입력Bison : 줄이기/줄이기 충돌을 수정하는 방법
%glr-parser
%%
s : e | p '=' s;
p : fp | p ',' fp;
fp : 'x';
e : te | e ';' te;
te : fe | te ',' fe;
fe : 'x';
몇 가지 예는 다음과 같습니다
x
x = x
x,x = x,x
x,x = x;x
x,x,x = x,x;x,x
x = x,x = x;x
무엇 난 후 것은 오른쪽에 그와 다르게 구문 분석하는 '='의 왼쪽에있는 X의의입니다. 그러나 '='부호의 오른쪽에 나타날 수있는 합법적 인 표현은 ';'때문에 왼쪽에있는 것보다 큽니다.
들소 (입력 파일이 test.y했다) 메시지를 인쇄합니다
test.y: conflicts: 1 reduce/reduce.
이 문제를 해결 몇 가지 방법이 있어야합니다. C에서는 비슷한 상황이 발생합니다. 아래 프로그램은 아무런 오류없이 gcc를 통과합니다. 기호 -이 경우는 'PX'와 'X'는 그들이 '='의 왼쪽 또는 오른쪽으로 표시할지 여부에 따라 다르게 취급받을에서
int main(void) {
int x;
int *px;
x;
*px;
*px = x = 1;
}
.
저는 C가 lvalue와 rvalue의 차이를 알기 위해 구문을 어떻게 사용할 수 있는지보고 싶지 않습니다. 에서 [C 문법] (http://www.lysator.liu.se/c/ANSI-C-grammar-y.html)을 사용하면 [CONSTANT = CONSTANT] 문을 가져올 수 있습니다 (https : // gist.github.com/toddkfisher/6665271). – tkf
@tkf : 예, 그렇습니다. 그 파생어 (그리고 rvalue가 과제의 왼쪽에있는 다른 오류)를 제거하면 문법의 표현이 상당히 복잡해 지겠지만, lvalues와 rvalues를 구별 할 때까지 가능했을 것입니다. (C++과는 다릅니다.) – rici