2012-04-12 4 views
0

繰り返しの回数をトークンストリームから抽出するためのよく知られたパーサー記述言語(Backus-Naurなど)がありますか?ボーナスポイントについては、この構文をサポートするC++ライブラリがありますか?繰り返しの「メタトークン」を持つパーサーの説明

例:

RULE = # EXPRESSION 

として:

は「メタトークン」#を呼び出すことができますし、私は次の形式の生成規則を扱っていました記述言語を探しています

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

カウントは実際の文字リテラルであることに注意してください。これは、我々は、フォームのルールを持つことができるaugmented Backus-Naur form、とは対照的である:

に相当します
RULE = 2*3EXPRESSION 

:私はそれはかなりだかわからない

:dgarantする

RULE = EXPRESSION EXPRESSION 
    | EXPRESSION EXPRESSION EXPRESSION 

レスポンス私が望むもの

int i; 

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

さらに重要なことに、このアイデアを説明できる形式化されたスキーマをいくつか期待していました。サイド・ノードでは、Spiritは使い慣れていますが、かなり素晴らしいです。ファンです。

答えて

0

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

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

それは正確に何をしたいようには見えませんが、それは仕事を取得します。

私はboost::spirit::qiがあなたの解析ニーズに合っていると信じています。 repeat directiveをご覧ください。

御霊が、あなたが解析された繰り返し回数を決定するに興味があるなら、あなたはルールに別のアクションを追加することができ、そのような

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パーサーのスタイルは慣れるのに時間がかかりますが、コードに直接組み込むことができるので非常に強力です。

+0

私は上記のコメントを追加しました。 – tgoodhart

+0

@tgoodhart私は自分の答えを更新しました。私はあなたが探しているものとまったく同じ言語標準を考えることはできません。 –

関連する問題