以下を含む SPIRIT 文法があります。
small %= char_("a-z");
large %= char_("A-Z");
digit %= char_("0-9");
symbol %= char_("!#$%&*+./<=>?@\\^|~:") | char_('-');
special %= char_("(),;[]`{}");
graphic %= small | large | symbol | digit | special | char_('"') | char_('\'');
dashes %= lit("--")>>*lit("-");
varsym %= ((symbol-lit(':'))>>*symbol)-reservedop-dashes;
reservedop %= string("..") | string(":") | string("::") | string("=") | string("\\") | string("|") | string("<-") | string("->") | string("@") | string("~") | string("=>");
Spirit は個別の字句解析器とパーサーを必要としない (字句解析器を使用する利点は何ですか? をqi::rule<Iterator, char()>
参照してください)。私は、最初の 6 つのルールを として定義し、最後の 3 つのルールをとして定義することで、この慣行に従いましたqi::rule<Iterator, std::string()>
。したがって、これらのルールには空白スキッパーがないことに注意してください。
varsym
また、 としてではなく として解析しようとしていることに注意してくださいreservedop
。reservedop
varsym ルール内のものを除外するためにのみ使用しています。
ただし、varsym の予約語の除外は機能しません。==
は有効である必要がありますvarsym
が、 で始まるため無視され=
ますreservedop
。
別の質問への答えは、次のようなものを定義することを提案しました
reservedop_ %= reservedop >> !symbol
そしてそれを使用します。ただし、これが機能するかどうかはわかりません。また、非常にエレガントに見えないことも確かです。
BOOST Spirit でこれを行う正しい方法は何ですか?