2

Boost Spirit を使用して、ファイルを解析して AST に変換したいと考えています。

私の AST のルートは、属性が 1 つだけのクラスです。

typedef boost::variant<FunctionDeclaration, GlobalVariableDeclaration> FirstLevelBlock;

struct Program {
    std::vector<FirstLevelBlock> blocks;
};

BOOST_FUSION_ADAPT_STRUCT(
    ::Program,
    (std::vector<eddic::FirstLevelBlock>, blocks)
)

単一のルールを使用して解析する場合:

program %= *(function | globalDeclaration);

コンパイルされませんが、Program に単一の文字列名を追加すると、うまく機能します。ベクトルをルートとして使用することもできますが、Program クラスにいくつかのメソッドを追加したいので、クラスを使用したいと考えています。

編集 :

プログラムを中かっこで囲むと、うまく機能します。

program %= lexer.left_brace >> *(function | globalDeclaration) >> lexer.right_brace;

コンパイルして正常に動作しますが、:

program %= *(function | globalDeclaration);

コンパイルされません...

このような単純なルールを使用することを妨げるブーストスピリットの何かがありますか?

4

1 に答える 1