c++ - 解析标识符但排除 BOOST Spirit 中的保留字

标签 c++ parsing boost boost-spirit

我有一个 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 不需要单独的词法分析器和解析器(请参阅 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 Spirit 中执行此操作的正确方法是什么?

最佳答案

在我看来,您混淆了词法分析和解析阶段。

he exclusion of reserved words in varsym doesn't work though. == should be a valid varsym but its ignored because it begins with = which is a reservedop.

该声明对于显示的代码没有多大意义,因为您从未展示如何使用规则:

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

看看

如果您想按照代码的建议使用从“正则表达式”定义的标记,请考虑将 Spirit 与基于 Lex 的标记生成器一起使用:

关于c++ - 解析标识符但排除 BOOST Spirit 中的保留字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13354391/

相关文章:

c - 能解析C代码的最简单的解析算法是什么?

boost - 从 Boost MultiIndex 中删除

c++ - 使用特定模式从 Boost 获取子图

c++ - 对于参数 'std::string {aka std::basic_string<char>}' 到 'char*',无法将 '2' 转换为 'int Save(int, char*)'

在语句结尾解析可选分号

c++ - std::mutex 锁定顺序

iphone - 如何为iPhone解析文件?我应该使用NSScanner吗?

c++ - 如何使用 boost::multi_index 组合键

c++ - C++中的标准库实现之间有什么区别?

c++ - 从 HDC 句柄创建 QPaintDevice