ホームページ  >  記事  >  バックエンド開発  >  記事の内容に適した質問ベースのタイトルをいくつか示します。 シンプルかつ直接的: * C で数式を解析する方法 : シャントヤード アルゴリズムと形式文法 * 解析マット

記事の内容に適した質問ベースのタイトルをいくつか示します。 シンプルかつ直接的: * C で数式を解析する方法 : シャントヤード アルゴリズムと形式文法 * 解析マット

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-27 20:44:01933ブラウズ

Here are some question-based titles that fit the content of your article:

Simple and direct:

* How to Parse Mathematical Expressions in C  : Shunting-Yard Algorithm and Formal Grammars
* Parsing Mathematical Expressions in C  : Two Effective Approaches

C での数式の解析

質問:

数式文字列が与えられた場合、どのように解析木を構築できますか?式を表すには?

解決策:

1.シャントヤード アルゴリズム:

シャンティング ヤード アルゴリズムは、中置式を後置 (逆ポーランド記法) に変換してから解析ツリーを構築する 2 パスのアプローチです。

  • 後置への挿入:

    • 演算子スタックと出力スタックの 2 つのスタックを作成します。
    • 中置式を左から右にスキャンします。
    • オペランドが見つかった場合は、出力スタックにプッシュされます。
    • 左括弧が見つかった場合は、演算子スタックにプッシュされます。
    • 右括弧が見つかった場合は、それを演算子スタックにプッシュします。
    • 演算子が見つかった場合、その優先順位が先頭の演算子よりも高い場合は、演算子スタックに演算子をプッシュします。それ以外の場合は、優先順位の高い演算子を演算子スタックからポップし、出力スタックにプッシュします。
  • 解析ツリーへの接尾辞:

    • 解析ツリーのルート ノードを作成します。
    • 出力スタックからオペランドをポップし、それらのリーフ ノードを作成します。
    • 出力スタックから演算子をポップし、内部ノードを作成しますオペランド用に作成されたノードを指す子を持つノード。
    • ルート ノードに子を接続します。

2.形式文法:

または、数式の形式文法を定義し、解析ツールを使用してパーサーを生成することもできます。数式の一般的な解析式文法 (PEG) は次のようになります。

Expr:   Term '+' Expr | Term '-' Expr | Term;
Term:   Factor '*' Term | Factor '/' Term | Factor;
Factor: Number | '(' Expr ')';

次のようないくつかの C/C ライブラリは PEG 解析をサポートしています。

  • boost::spirit
  • pyPEG2
  • PCRE

以上が記事の内容に適した質問ベースのタイトルをいくつか示します。 シンプルかつ直接的: * C で数式を解析する方法 : シャントヤード アルゴリズムと形式文法 * 解析マットの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。