【发布时间】:2013-09-03 20:51:13
【问题描述】:
这个问题很简单,我写了一个词法分析器,使用 boost::spirit,但是我似乎找不到生成EOF 令牌的方法。 - 那么如何去做呢?
【问题讨论】:
标签: token boost-spirit eof boost-spirit-lex
这个问题很简单,我写了一个词法分析器,使用 boost::spirit,但是我似乎找不到生成EOF 令牌的方法。 - 那么如何去做呢?
【问题讨论】:
标签: token boost-spirit eof boost-spirit-lex
什么是 EOF 令牌?
从历史上看,一些平台将特殊的“EOF”(例如 ascii 26)字符与文本文件相关联。与use of 0x15 as newline character 一样,此类用途现在已基本不复存在。文件的结尾最好定义为没有进一步的输入,换句话说:它是一个流状态,而不是一个字符。
标记迭代器 Spirit Lex 通过返回结束迭代器发出“EOF”信号。
分词器 API (lex::tokenize(...)) 和 Spirit Qi 都理解这种行为(通过退出分词循环 (lex) 和/或通过使 qi::eoi 解析器成功匹配)。
例如如果您需要断言解析到达输入的末尾,您只需说
myrule = subrule1 >> subrule2 > qi::eoi;
或者,如果您想在输入结束时断言某些东西的存在(例如,结束 ;)除非:
myrule = subrule1 >> subrule2 >> (qi::eoi | ';');
我是否遗漏了一些没有像这样解决的问题?
【讨论】:
qi::eoi!但是,如果我在我的语法中使用它,那么如果 tokenize_and_parse 函数返回 true,我是否可以假设所有输入都已被使用? - 也就是说,我可以假设 (begin == end),其中 begin 和 end 是我的输入迭代器。
eoi 所做的只是使用船长,然后简单地返回first 和last 是否相等(qi::skip_over(first, last, skipper);return first == last;)。所以是的,我认为您可以假设,如果它们不相等,则解析将失败。
>> 而不是>?
>,即'expectation operator'(而不是[>>'sequence operator](http://www.boost.org/doc/libs/1_54_0/libs/spirit/doc/html/spirit/qi/reference/operator/sequence.html)) because I imagined a requirement _如果你需要断言解析已经结束_. Expectation points fail with an expectation_failure ` 如果它们不匹配(而不是“软失败”,它允许调用解析器回溯或尝试替代方案)