2

以下を含む 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また、 としてではなく として解析しようとしていることに注意してくださいreservedopreservedopvarsym ルール内のものを除外するためにのみ使用しています。

ただし、varsym の予約語の除外は機能しません。==は有効である必要がありますvarsymが、 で始まるため無視され=ますreservedop

別の質問への答えは、次のようなものを定義することを提案しました

    reservedop_ %= reservedop >> !symbol

そしてそれを使用します。ただし、これが機能するかどうかはわかりません。また、非常にエレガントに見えないことも確かです。

BOOST Spirit でこれを行う正しい方法は何ですか?

4

1 に答える 1

2

字句解析と解析のフェーズを混同しているようです。

ただし、varsym の予約語の除外は機能しません。== は有効な varsym である必要がありますが、reservedop である = で始まるため無視されます。

このステートメントは、ルールの使用方法を示していないため、示されているコードではあまり意味がありません。

 rule1 = varsym | reservedop; // would parse "==" as varsym
 rule2 = reservedop | varsym; // would parse "==" as reservedop

見る

コードが示唆しているように「正規表現」から定義されたトークンを操作したい場合は、Spirit を Lex ベースのトークナイザーで使用することを検討してください。

于 2012-11-13T08:27:53.100 に答える