문제

저는 쓰기 문법에 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
;

이 접근 방식이다.

이 기본적인 문제는 없다는 것을 우선순위에 대한 INCDEC 토큰,그래서 그것을 알지 못하는 방법을 해결하는 모호성을 포함하는 우측의 INCDEC.를 추가하는 경우

%right INC DEC

의 끝에 우선 순위 목록을(당신이 원하는 unaries 높은 우선 순위와 후보다 더 높은 prefix),그것은,그것을 해결할 수 있습 get rid of all the PREINC/POSTINC 물건으로,그것은 관련이 있습니다.

즉,사전 증가 및 사후 증가가 있습자가 nonassoc 그래서 정의는 우선 순위 섹션에서는 규칙을 만들의 우선 순위는 다음 연산자를 사용하여 높 %prec

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top