2017-02-04 9 views
-1

変換方式:LEX -YACCパーサ

expr -> {print("+")} expr + term 
     | {print("-")} expr - term 
     | term 
term -> {print("*")} term * factor 
     | {print("/")} term/factor 
     | factor 
factor -> digit {print(digit)} 
     | (expr) 

文法上はプレフィックス形式で式を出力します。この文法では、パーサーを書くことはできません。 接尾辞を接頭辞に変換するlexとyaccプログラムを書くにはどうすればいいですか? 私はこれに続き、適切な出力を得ていません。lex and yacc program to convert infix to prefixパーサーを書く方法。

+0

[bisonマニュアル](https://www.gnu.org/software/bison/manual/bison.html#Infix-Calc)には、yacc/bisonツールの紹介があり、簡単な電卓文法の例が含まれています。 – rici

+0

また、確かに動作しないコードについてのSOの質問ではなく、実際の作業コードをモデルとして使用することをお勧めします。 (もしうまくいけば、質問はされませんでした)。 – rici

+0

'適切な出力が得られません'というのは、 'パーサーを書くことができません'と同じではありません。 – EJP

答えて

0

オペレータトークンを出力することはできません(それを認識する)まで、オペレータトークンを出力することはできませんので、演算子の前に式の文字列を保存する必要があります。オペレーターの後にを放出することができます。つまり、ルールでは翻訳された文字列を作成し、完全な式を解析した後にのみ文字列を出力する必要があります。

asprintfまたは+ strcpy/strcat/sprintfmalloc、その後は後でときに適切に無料のものを心配あなたが使用することができますCの建物の文字列のいくつかの方法があります。または、あなたのためのメモリを追跡し、クリーンアップに対処することができますいくつかの並べ替えの文字列プールを使用することができます。

関連する問題