1

bison と flex を使用して単純な C++ 電卓を作成したいと考えています。私はパーサーを作成するのが初めてであることに注意してください。bison/flex で既にいくつかの例を見つけましたが、それらはすべて C で記述されていました。

私の目標は、クラスに値、操作、関数のノードが含まれる C++ コードを作成して、AST を作成することです (評価は、AST 全体を作成した直後に、ルートから開始して実行されます)。

例えば:

my_var = sqrt(9 ** 2 - 32) + 4 - 20 / 5
my_var * 3

次のように解析されます。

        =
      /   \
my_var     +
         /   \
     sqrt     -
       |     / \
       -    4   /
      / \      / \
    **   32   20  5
   /  \
  9    2

2 番目の AST は次のようになります。

       *
      / \
my_var   3

次に、次の疑似コードは AST を反映しています。

ast_root = create_node('=', new_variable("my_var"), exp)

ここで、expは次のとおりです。

exp = create_node(OPERATOR, val1, val2)

しかし、このようではありません:

$$ = $1 OPERATOR $3

このようにして、ノードを作成する代わりに操作の値を直接取得するためです。

Node には type (of operation)、val1 (Node)、val2 (Node) を含める必要があると思います。場合によっては、val2 が NULL になることがあります。たとえば、上記のsqrtのように、最後に 1 つの引数を取ります。右?

ASTでノードを作成/保持する方法を理解するために、上記の問題(ASTを作成する* .yファイルを含む)に対するC++スケルトン(評価なし)を提案していただければ幸いです。アイデアを得るために、コードを切り取ることができます。

また、ご存知の場合は、既存の (おそらく単純な) 例を教えていただければ幸いです。

お時間とご協力ありがとうございました。

4

1 に答える 1

1

http://www.progtools.org/compilers/tutorials/cxx_and_bison/cxx_and_bison.htmlは、必要なものを作成するミニチュートリアルです。

于 2010-06-07T22:54:09.367 に答える