0

もう一度修正。再帰を削除し、中置式のコードを記述した後: 優先度チェックも含まれ、再帰文法も開始非端末もエラー メッセージもありません。

%{
#include<stdio.h>
%}

%token ALPHA NUMBER PLUS MINUS MUL DIV LPAR RPAR

%%

expr : expr PLUS term     { printf("its an infix expression");  }
     | expr MINUS term    
     | term 
     ; 

term : term MUL factor
     | term DIV factor
     | factor
     ;


factor : LPAR expr RPAR 
       | NUMBER 
       | ALPHA
       ;
%%
main()
{
yyparse();
}

int yyerror (char *s)
{

    printf("Not an infix expression");
}

これで大丈夫ですか?

4

1 に答える 1

1

いいえ、そうではありません。すべての競合は別として、演算子の優先順位は定義されていません。インターネット上には、LR 表現文法の正しい例がたくさんあります。

編集:単項マイナスは、欠落しているprimaryルールに入ります。そこからfactor、通常は次のようになります。

factor: primary
    | primary '^' factor // exponentiation, note right-recursion for right-associativitity, or use %prec
    ;

primary: '(' expr ')'
    | '-' primary // unary minus; note recursion, to allow any number of them
    | NUMBER
    | IDENTIFIER
    ;
于 2012-10-18T07:31:55.603 に答える