0

トークンストリームから繰り返しの数が抽出される繰り返しを可能にする、よく知られたパーサー記述言語(Backus-Naurなど)はありますか?ボーナスポイントとして、この構文をサポートするC ++ライブラリはありますか?

例:

「メタトークン」#と呼びましょう。次に、次の形式の生成ルールを処理する記述言語を探しています。

RULE = # EXPRESSION

として:

RULE = '1' EXPRESSION
     | '2' EXPRESSION EXPRESSION
     | '3' EXPRESSION EXPRESSION EXPRESSION
     | '4' EXPRESSION EXPRESSION EXPRESSION EXPRESSION
     | ...

カウントは実際の文字リテラルであることに注意してください。これは、次の形式のルールを持つことができる拡張バッカス・ナウア記法とは対照的です。

RULE = 2*3EXPRESSION

これは次と同等です:

RULE = EXPRESSION EXPRESSION
     | EXPRESSION EXPRESSION EXPRESSION

dgarantへの応答:

それが私が望んでいることかどうかはわかりません。私は次の線に沿って何かを考えています:

int i;

bool r = phrase_parse(first, last,
     (
       int_[ phoenix::ref(i) = _1] >> repeat(i)[/*EXPRESSION*/]
     )
     space );

さらに重要なのは、このアイデアを説明できる形式化されたスキーマを望んでいたことです。サイドノードでは、Spiritはある程度慣れることができますが、かなり素晴らしいです。ファンです。

4

1 に答える 1

0

文字リテラルのrule = # EXPRESSION繰り返しを指定できる形式言語は考えられません。#私の意見では、あなたがあなたが何を意味するのかを明確にするためにコメントをするならば、正式な言語仕様を乱用することは問題ではないはずです。本当に標準に固執したい場合は、ABNFで次のことを行うことができます。

rule = '3' 3EXPRESSION
     | '4' 4EXPRESSION
     | '5' 5EXPRESSION

それはあなたが望むものと正確には見えませんが、それは仕事を成し遂げます。

boost :: spirit::qiは構文解析のニーズに合うと思います。repeatディレクティブを見てください。

スピリットはあなたが次のようなルールを書くことを可能にするでしょう

rule = char_("'") >> int_[qi::_a = qi::_1] >> char_("'") >> repeat(qi::_a)[EXPRESSION]

解析された繰り返しの数を決定することに関心がある場合は、ルールに別のアクションを追加できます。[phoenix::ref(pCt) = qi::_a]

std::vector<double>& v;
int pCt;

bool r = phrase_parse(first, last,
         (
           // to parse a collection of double expressions
           char_("'") >> int_[qi::_a = qi::_1] >> char_("'") >> repeat(qi::_a)[double_[push_back(phoenix::ref(v), _1)]]
           [phoenix::ref(pCt) = qi::_a]
         )
         space);
// assuming the parse was successful
std::cout << "Parsed " << pCt << " elements" << std::endl;

Spirit :: Qiパーサーのスタイルには慣れるのに少し時間がかかりますが、コードに直接統合できるため、非常に強力です。

于 2012-04-12T23:56:13.277 に答える