0
"bison -d filename.y"할 때 다음과 같은 Bison 문법 파일이 있습니다. 메시지가 나타납니다.Shift 키를 누르면 Bison 문법의 충돌을 줄일 수 있습니까?
: 5 Shift/Reduce.
사실 그들은 8 살 이었지만 나머지는 어디 있는지 모르겠다. 나는 그것이 COMMA와 관련이 있다고 생각하지만 흠 .. anyidea가 내 문법 정의에서 잘못된 점은 무엇인가. 파서는에 당신이 operation
을 확장입니다
exp : num
| var
| exp PLUS exp
| exp MINUS exp
| exp MULTIP exp
| exp DIVIDE exp
| exp MOD exp
| PARENTLEFT exp PARENTRIGHT
;
에 exp
의 정의를 변경하면 프롤로그 구문
%{#include <math.h>
#include <stdio.h>
void yyerror(char *message);
%}
%start program
%token ATOM VAR NUM
%token DOT COMMA
%token PARENTLEFT PARENTRIGHT RSQRBRACKETS LSQRBRACKETS
%token IF CUT IS PIPE
%token SMALLEREQ GREQ SMALLER GREATER EQ
%token PLUS MULTIP DIVIDE MINUS MOD
%token Aus
%left PLUS MINUS
%left DIVIDE MULTIP
%left COMMA
%%
program : program rule { printf("programm fertig gelesen \n");}
| program fact { printf("programm fertig gelesen \n");}
| rule { printf("programm fertig gelesen \n");}
| fact { printf("programm fertig gelesen \n");}
;
fact : struct DOT { printf("Fakt gelesen\n\n\n"); }
;
rule : struct IF subProbList DOT { printf("Regel mit %d Teilprobleme gelesen\n\n\n", $3); }
;
struct : ATOM PARENTLEFT parameterList PARENTRIGHT {printf("%s mit %d Variablen\n",$1,$3); $$=$3;}
;
subProbList : subProb {$$ = 1; }
| subProbList COMMA subProb {$$ = $1 + 1;}
;
subProb : struct | assignmentTerm | comparison | CUT { printf("CUT Op\n"); }
;
assignmentTerm : exp IS exp { printf("is mit %d Variabeln\n", ($1 + $3)); $$ = $1 + $3; }
;
exp : num { $$ = 0; }
| var { printf("Variable %s \n", $1); $$ = 1; }
| exp operation exp { printf("left exp is %d right exp is %d\n",$1,$3); $$ = $1 + $3;}
| PARENTLEFT exp PARENTRIGHT { $$ = $2;}
;
parameter : var { printf("Variable %s\n",$1); $$ = 1; }
| struct { $$ = $1; }
| list { $$ = $1; }
;
parameterList : parameter { $$ = $1;}
| parameterList COMMA parameter {$$= $1 + $3;}
;
operation : PLUS | MINUS | MULTIP | DIVIDE | MOD
;
comparison : var comparisonOp num { printf("Variable %s \n", $1);
printf("Vergleich mit 1 Vars\n");
$$=1;
}
| num comparisonOp var {
printf("Variable %s \n", $3);
printf("Vergleich mit 1 Vars\n");
$$=1;
}
| var comparisonOp var { printf("Variable %s \n", $1);
printf("Variable %s \n", $3);
printf("Vergleich mit 2 Vars\n");
$$=2;
}
| num comparisonOp num {
$$=0;
printf("Vergleich mit 0 Variablen \n");
}
;
comparisonOp : EQ | GREATER | SMALLER | GREQ | SMALLEREQ
;
list : LSQRBRACKETS varList RSQRBRACKETS {$$ = $2;}
| LSQRBRACKETS elementList RSQRBRACKETS {$$ = $2;}
| LSQRBRACKETS RSQRBRACKETS {$$ = 0;}
;
varList : var PIPE var { printf("Variable %s \n", $1);
printf("Variable %s \n", $3);
$$ = 2;
}
;
elementList : ATOM { $$ = 0;}
| var { printf("Variable %s \n", $1); $$ = 1; }
| elementList COMMA var { $$ = $1 + 1; }
| elementList COMMA ATOM { $$ = $1; }
;
num : NUM | MINUS NUM
;
var : VAR | MINUS VAR
;
%%
int main(int argc, char **argv){
yyparse();
return 0;
}
void yyerror(char *message) {
printf("How about no?Well,no,that word doesnt belong to this classy language! \n");
}
btw, 파서는 내가 입력으로 완벽하게 파싱하므로 원하는대로 작동하지만 충돌이 제거 될 수 있으면 좋을 것입니다. – StaticBug