1

YACCを使用して文字列操作用のコンピューターを実装する必要があります。+(文字列を連結するため)や*(文字列をそれ自体でn回strcatするため)などの操作を実装する必要があります。これらの操作は文字列を返し、非終端記号t1で使用します。 .BUt数値を返す操作もあります。これらの操作はt2非終端記号です。

たとえば、私は持っています:

      expr1: expr1 '+' expr1 { strcpy($$,$1); strcat($$,$3);}
       | expr1 '-' expr1 { strcpy($$,minus($1,$3));}    
           | | expr1 '*' NUMBER {strcpy($$,mul($1,$3));}
           |STRING;

そして、私が持っています:

     expr2 : STRING '?' STRING {strcpy($$nr_of_aparitions($1,$3));}
 ;

重要なのは、expr2で定義された操作は常にNUMBERを返すということです。次の状態になるまで、すべて正常に動作します。

'dfdf'がある場合は?'edfd "たとえば、すべて正常に機能します。問題は、expr2にexpr1を実装する必要がある場合に発生します:expr1?expr2循環性が表示されるため、何か提案できますか?

4

1 に答える 1

1

一般に、「循環性」と呼ばれるものや、私が「再帰」と呼ぶもの、つまりexpr1での数値式の使用、またはその逆について心配する必要はありません。

コードを理解しやすくするために、文法フラグメントを次のように書き直します。

stringExpr : stringExpr '+' stringExpr { strcpy($$,$1); strcat($$,$3); }
           | stringExpr '-' stringExpr { strcpy($$,minus($1,$3)); }    
           | stringExpr '*' numberExpr { strcpy($$,mul($1,$3)); }
           | STRING
           ;

numberExpr : stringExpr '?' stringExpr { strcpy($$nr_of_aparitions($1,$3)); }
           | NUMBER
           ;

(私はあなたのexpr1の空のルールを削除しました-それは意図されていなかったと思います。)

なぜ通常の算術の文法規則、のような式がないのだろうかと思います5 + 2が、おそらくそれはあなたの計画の一部ではありません。

"foobar" - 1 + 1通常の算術をサポートするつもりなら、どのように解釈されるべきかを考える必要があります。その時点で、演算子の優先順位についてyacc/bisonの機能を確認することをお勧めします。

于 2013-01-24T15:16:46.570 に答える