를 해결하는 방법 YACC 이동/충돌을 감소에서 사후 증가 operator?
-
23-08-2019 - |
문제
저는 쓰기 문법에 YACC(실제로는 들소),그리고 나는 교대/축소 문제입니다.그것은 결과를 포함하여 후위 증가와 감소 연산자입니다.여기에 손질한 버전의 문법:
%token NUMBER ID INC DEC
%left '+' '-'
%left '*' '/'
%right PREINC
%left POSTINC
%%
expr: NUMBER
| ID
| expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| INC expr %prec PREINC
| DEC expr %prec PREINC
| expr INC %prec POSTINC
| expr DEC %prec POSTINC
| '(' expr ')'
;
%%
Bison 말이 있 12shift/을 줄이면 충돌이 발생하지 않지만 만약 내가 주석으로 라인에 대한 후위 증가와 감소,이 상품에 대한 리뷰가 없습니다.사람이 어떻게 개선할 수 있는지 알고 있습니다.이 시점에서,나는 고려해 이동하는 LL(k)파서 생성기는 훨씬 쉽게 하지만,LALR 문법이 항상 보이 훨씬 더 많은 자연을 작성합니다.또한 저는 GLR,하지만 난 어떤 좋은 C/C++GLR 파서 생성기.
해결책
Bison/Yacc 을 생성할 수 있습 GLR 파서 지정하는 경우 %glr-parser
옵션에서 섹션입니다.
다른 팁
이것을 보십시오:
%token NUMBER ID INC DEC
%left '+' '-'
%left '*' '/'
%nonassoc '++' '--'
%left '('
%%
expr: NUMBER
| ID
| expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| '++' expr
| '--' expr
| expr '++'
| expr '--'
| '(' expr ')'
;
%%
키 선언하는 것입 후 사업자로 연관 비.그렇지 않으면 당신은 할 수있을 것입
++var++--
괄호도 할 필요가 주어진 우선 순위를 최소화하 이동/감소한 경고
싶을 정의합니다.할 필요가 없이%,왼쪽%오른쪽%prec 물건입니다.
simple_expr: NUMBER
| INC simple_expr
| DEC simple_expr
| '(' expr ')'
;
term: simple_expr
| term '*' simple_expr
| term '/' simple_expr
;
expr: term
| expr '+' term
| expr '-' term
;
이 접근 방식이다.
이 기본적인 문제는 없다는 것을 우선순위에 대한 INC
고 DEC
토큰,그래서 그것을 알지 못하는 방법을 해결하는 모호성을 포함하는 우측의 INC
나 DEC
.를 추가하는 경우
%right INC DEC
의 끝에 우선 순위 목록을(당신이 원하는 unaries 높은 우선 순위와 후보다 더 높은 prefix),그것은,그것을 해결할 수 있습 get rid of all the PREINC
/POSTINC
물건으로,그것은 관련이 있습니다.
즉,사전 증가 및 사후 증가가 있습자가 nonassoc 그래서 정의는 우선 순위 섹션에서는 규칙을 만들의 우선 순위는 다음 연산자를 사용하여 높 %prec