スピリットパーサーフレームワーク

Spirit Parser Frameworkは、テンプレートメタプログラミング技術を用いて実装されたオブジェクト指向の 再帰下降 パーサー生成フレームワークです。式テンプレートを用いることで、拡張バッカス・ナウア記法(EBNF)の構文をC++で完全に近似することができます。[1]パーサーオブジェクトは演算子のオーバーロードによって構成され、その結果、曖昧な文法を解析できるバックトラッキングLL(∞)パーサーが実現されます。

Spirit は、字句解析と解析の両方に、一緒にまたは別々に使用できます

このフレームワークはBoost ライブラリの一部です

オペレーター

C++ 言語の制限のため、Spirit の構文は C++ の演算子の優先順位に基づいて設計されており、EBNF正規表現の両方に似ています。

構文説明
x >> yx の後に y が続くように一致します。
x > yx に一致した後、y を期待します。
*xx の0回以上の繰り返しに一致します。これはクリーネスターを表します。C++には単項接尾辞演算子* がありません。
x | yx を一致させます。x が一致しない場合は、y を一致させてみます。
+xx の 1 回以上の出現の連続に一致します。
-xx を 0 回または 1 回一致させます。
x & yxとyを一致させます。
x - yx は一致しますが、y は一致しません。
x ^ yx、y、またはその両方を任意の順序で一致させます。
x || yx、または y、または x の後に y が続くものに一致します。
x [ function_expression ]x が一致した場合、function_expression によって返された関数/関数を実行します。
( x )一致x(優先度のグループ化に使用できます)
x % yy の出現で区切られた、x の 1 回以上の出現に一致します。
~xx 以外の文字に一致します (ch_p や alnum_p などの文字クラスのみ)

この例では、セマンティック アクションでインライン パーサー式を使用する方法を示します。

#include <文字列> #include <iostream> #include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/phoenix.hpp> int main () { namespace qi = boost :: spirit :: qi ;           std :: string input ; std :: cout << "Input a line: \n " ; getline ( std :: cin , input ); std :: cout << "Got '" << input << "'." \n " ; unsigned count = 0 ; /* 次に、 次のセマンティクスで構築されたパーサーを使用して 、入力 (input.c_str()) を解析します。 ( リテラル文字列 "cat" (一致した場合、カウンター "count" をインクリメントします) または任意の文字 (スキップされます) の 0 回以上の出現 )                      パーサーは演算子オーバーロードとテンプレート マッチングを使用してコンパイラによって構築される ため、実際の作業は qi::parse() 内で行われ、 * で始まる式は解析 関数が使用するルール オブジェクトのみを初期化します。 */ auto rule = * ( qi :: lit ( "cat" ) [ ++ qi :: _val ] | qi :: omit [ qi :: char_ ]); qi :: parse ( input . begin (), input . end (), rule , count );               // 最後に結果を表示します。std :: cout << "入力には'cat' が" << count << " 回含まれていました\ n " ; }       

参考文献

  1. ^ Guzman, Joel de; Kaiser, Hartmut. 「Spirit 2.59 - Introduction」. Boost.org . Boost . 2025年3月22日閲覧
  • Spiritパーサーフレームワークのgithubページ
  • Spiritパーサーフレームワーク
  • Boostプロジェクトのドキュメント
  • デザイナーのジョエル・デ・グスマンによるスピリットに関する記事(ドクター・ドブズ・ジャーナル)


Retrieved from "https://en.wikipedia.org/w/index.php?title=Spirit_Parser_Framework&oldid=1303150022"