단항 마이너스 피연산자를 사용하는 아주 간단한 문법을 고안하고 있습니다. 그러나 나는 shift/reduce 충돌을 얻는다. Bison 매뉴얼과 다른 곳에서는 새로운 토큰을 정의하고 이진 빼기 피연산자보다 더 높은 우선 순위를 부여한 다음 규칙에 "% prec TOKEN"을 사용하는 것이 좋습니다.Bison에서 단항 마이너스에 우선 순위를 사용하면 시프트/축소 충돌이 해결되지 않습니다.
나는 해봤지만 여전히 경고를 받는다. 왜?
나는 바이슨 (GNU Bison) 2.4.1을 사용하고 있습니다. 문법은 다음과 같습니다.
%{
#include <string>
extern "C" int yylex(void);
%}
%union {
std::string token;
}
%token <token> T_IDENTIFIER T_NUMBER
%token T_EQUAL T_LPAREN T_RPAREN
%right T_EQUAL
%left T_PLUS T_MINUS
%left T_MUL T_DIV
%left UNARY
%start program
%%
program : statements expr
;
statements : '\n'
| statements line
;
line : assignment
| expr
;
assignment : T_IDENTIFIER T_EQUAL expr
;
expr : T_NUMBER
| T_IDENTIFIER
| expr T_PLUS expr
| expr T_MINUS expr
| expr T_MUL expr
| expr T_DIV expr
| T_MINUS expr %prec UNARY
| T_LPAREN expr T_RPAREN
;
작업을 추가 한 후에는 "고정"되었기 때문에이 질문을 잊어 버렸습니다. 그것이 중요하지 않아야했지만, 이제는 효과가 있었고 그것에 대해서는별로 신경 쓰지 않았습니다. 그러나 필자의 문법을 되돌아 보면, 필자는 라인이 _ 세미콜론으로 끝나기 때문에 오래된 버전이나 다른 것을 제출 했음에 틀림 없다는 것을 알고있다. 나는 내가 행동을 추가했을 때 어떤 점에서 그것들을 추가해야만한다고 생각한다. 그래서 충돌을 해결한다. 이것을 지적 해 주셔서 감사합니다. – gablin