我有一個包含SPIRIT語法不包括保留字:解析標識符,但在BOOST精神
small %= char_("a-z");
large %= char_("A-Z");
digit %= char_("0-9");
symbol %= char_("!#$%&*+./<=>[email protected]\\^|~:") | 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("=>");
精神並不需要一個單獨的詞法和語法分析器(見What are the Benefits of Using a Lexer?),我已經通過定義遵循這一做法前六條規則爲qi::rule<Iterator, char()>
,後三條規則爲qi::rule<Iterator, std::string()>
。請注意,這些規則因此沒有空白字符。
此外,請注意,我試圖解析的東西爲varsym
,而不是reservedop
。我只使用reservedop
來排除varsym規則中的內容。
雖然在varsym中保留字的排除不起作用。 ==
應該是有效的varsym
,但忽略它,因爲它以=
開頭,這是reservedop
。
回答另一個問題時建議使用定義諸如
reservedop_ %= reservedop >> !symbol
,然後東西。不過,我不確定這是否有效,而且它看起來不太優雅。
在BOOST精神中做到這一點的正確方法是什麼?
如果它是不是很明顯,這是一個用於解析Haskell這樣的語法的一部分這是對Haskell報告中規則的大致直譯。 – BenRI