キーワードではない英数字文字列を解析する識別子パーサーを書くのに苦労しています。キーワードはすべて表にあります。
struct keywords_t : x3::symbols<x3::unused_type> {
keywords_t() {
add("for", x3::unused)
("in", x3::unused)
("while", x3::unused);
}
} const keywords;
識別子のパーサーは次のようになります。
auto const identifier_def =
x3::lexeme[
(x3::alpha | '_') >> *(x3::alnum | '_')
];
これらを組み合わせて、識別子パーサーがキーワードの解析に失敗するようにしました。私はこのように試しました:
auto const identifier_def =
x3::lexeme[
(x3::alpha | '_') >> *(x3::alnum | '_')
]-keywords;
この:
auto const identifier_def =
x3::lexeme[
(x3::alpha | '_') >> *(x3::alnum | '_') - keywords
];
ほとんどの入力で機能しますが、文字列が次のようなキーワードで始まる場合int, whilefoo, forbar
、パーサーはこの文字列の解析に失敗します。このパーサーを正しくするにはどうすればよいですか?