2

私はバイソンで簡単なパーサーを書いています。パーサーは、次の文法に関してプログラムに構文エラーがあるかどうかをチェックします。

%{
#include <stdio.h>
void yyerror (const char *s) /* Called by yyparse on error */
{
    printf ("%s\n", s);
}
%}
%token tNUM tINT tREAL tIDENT tINTTYPE tREALTYPE tINTMATRIXTYPE 
%token tREALMATRIXTYPE tINTVECTORTYPE tREALVECTORTYPE tTRANSPOSE
%token tIF tENDIF tDOTPROD tEQ tNE tGTE tLTE tGT tLT tOR tAND
%left "(" ")" "[" "]"
%left "<" "<=" ">" ">="
%right "="
%left "+" "-"
%left "*" "/"
%left "||"
%left "&&"
%left "==" "!="

%% /* Grammar rules and actions follow */
prog: stmtlst ;
stmtlst: stmt | stmt stmtlst ;
stmt: decl | asgn | if;
decl: type vars "=" expr ";" ;
type: tINTTYPE | tINTVECTORTYPE  | tINTMATRIXTYPE | tREALTYPE | tREALVECTORTYPE 
      | tREALMATRIXTYPE ;
vars: tIDENT | tIDENT "," vars ;
asgn: tIDENT "=" expr ";" ;
if: tIF "(" bool ")" stmtlst tENDIF ;
expr: tIDENT | tINT | tREAL | vectorLit | matrixLit | expr "+" expr| expr "-" expr
  | expr "*" expr | expr "/" expr| expr tDOTPROD expr | transpose ;
transpose: tTRANSPOSE "(" expr ")" ;
vectorLit: "[" row "]" ;
matrixLit: "[" row ";" rows "]" ;
row: value | value "," row ;
rows: row  | row ";" rows ; 
value: tINT | tREAL | tIDENT ;
bool: comp | bool tAND bool | bool tOR bool ;
comp: expr relation expr ;
relation: tGT | tLT | tGTE | tLTE | tNE | tEQ ;
%%
int main ()
{    
    if (yyparse()) {
        // parse error
        printf("ERROR\n");
        return 1;
    }
    else {
        // successful parsing
        printf("OK\n");
        return 0;
    }
}

コードは長くて複雑に見えるかもしれませんが、私が尋ねようとしていることは完全なコードを必要としないと思いますが、いずれにせよ私はコードを書くことを好みました。私の文法は正しいと確信していますが、あいまいです。「bison-dfilename.y」と記述してプログラムの実行可能ファイルを作成しようとすると、競合するというエラーが表示されます。13shift/reduce。このファイルの先頭で演算子の優先順位を定義し、これらの優先順位の多くの組み合わせを試しましたが、それでもこのエラーが発生します。このあいまいさを取り除くにはどうすればよいですか?ありがとうございました

4

1 に答える 1

4

tOR、、tANDおよびtDOTPRODそれらの優先順位も指定する必要があります。

于 2013-03-10T23:05:32.693 に答える