2013-04-13 2 views
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"); 
} 
+0

btw, 파서는 내가 입력으로 완벽하게 파싱하므로 원하는대로 작동하지만 충돌이 제거 될 수 있으면 좋을 것입니다. – StaticBug

답변

2

의 일부를 구문 분석 (및 제거) exp 내부 및 추가하도록되어

%left MOD 

다른 연산자와 관련하여 다른 연산자와의 우선 순위를 정의하면 괜찮을 것입니다.

관련 문제