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);
コンパイルされません...
このような単純なルールを使用することを妨げるブーストスピリットの何かがありますか?