0

x、y、+、-、*、/(,) をサポートする非常に単純な電卓を作成しようとしています。アイデアは簡単です:

  1. 入力文字列 ("x+3y" の可能性があります) から構文ツリーを構築します。
  2. 指定された x,y に対して、構文ツリーを解析し、x と y に int を挿入して結果を計算します。

boost 1.46 では、parse_phrase() を使用して、両方のステップを一度に簡単に実行できます。ただし、解析は変更されませんが、ステップ 2 を何百万回も実行する必要があります。ですから、これを分けたいと思います(クラシックスピリットバージョンでは通常のように)。これどうやってするの?(注意: ブースト 1.46 にはまだ utree データ構造がありません)

4

1 に答える 1

2

その間に解決策を見つけました。これは非常に簡単です。ここにリンクされているブースト ドキュメントを見てください。

main() 関数には次のコードが含まれています。

expression_ast ast;
ast_print printer;
bool r = phrase_parse(iter, end, calc, space, ast);

if (r && iter == end)
{
    // [...]
    printer(ast);
    // [...]
}

ブーストには実際には複数のphrase_parse()関数があります。boost docs に記載されているように、phrase_parse なしのバリエーションと「追加の引数: パーサーの属性を含むphrase_parse のバリエーション」があります。上記のコードでastは、パーサーの属性です。printer次に ast を評価します。

外部からの異なる値でプリンターを評価したい場合は、各呼び出しの前にそれらをプリンターに渡しますprinter(ast)

1.46 の注意: まだありboost::utreeません。ただし、この例の AST は、完全な機能を備えた代替品です。

于 2012-08-25T06:25:12.887 に答える