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++スケルトン(評価なし)を提案していただければ幸いです。アイデアを得るために、コードを切り取ることができます。
また、ご存知の場合は、既存の (おそらく単純な) 例を教えていただければ幸いです。
お時間とご協力ありがとうございました。