Loading article…
Spirit Parser Framework は、テンプレートメタプログラミング技術を使用して実装されたオブジェクト指向の再帰下降パーサー生成フレームワークです。式テンプレートを使用すると、ユーザーは拡張バッカス・ナウア記法(EBNF)の構文をC++で完全に近似できます。[ 1 ]パーサーオブジェクトは演算子オーバーロードによって構成され、その結果、かなり曖昧な文法を解析できるバックトラッキングLL(∞)パーサーが実現します。
Spiritは、字句解析と構文解析の両方に使用でき、両方を同時に使用することも、別々に使用することもできます。
このフレームワークはBoostライブラリの一部です。
C++言語の制約のため、Spiritの構文はC++の演算子の優先順位に基づいて設計されていますが、EBNFと正規表現の両方に類似しています。
この例は、インラインパーサー式を意味的アクションと組み合わせて使用する方法を示しています。
#include <string> #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 << "行を入力してください: \n " ; getline ( std :: cin , input ); std :: cout << "入力された文字列: '" << input << "'。\n " ; unsigned count = 0 ; /* 次に、 次のセマンティクスで構築されたパーサーを使用して 、入力 (input.c_str()) を解析します。 0 回以上の出現 ( リテラル文字列 "cat" (一致した場合、カウンタ "count" をインクリメント) または任意の文字 (スキップされます) ) パーサーはコンパイラが演算子オーバーロードと テンプレートマッチングを使用して構築するため、実際の処理は qi::parse() 内で行われ、 * で始まる式は、解析関数が使用するルールオブジェクトを初期化するだけです 。 */ auto rule = * ( qi :: lit ( "cat" ) [ ++ qi :: _val ] | qi :: omit [ qi :: char_ ]); qi :: parse ( input . begin (), input . end (), rule , count );// 最後に、結果を表示します。std :: cout << "入力には" << count << "個の「cat」が含まれていました\n " ; }