我正在练习使用Spirit x3解析C language并将其存储在自定义数据结构中。
但我遇到了巨大的困难,5天后仍然无法编译。
提示的大多数错误都是不完整的结构,无法进行赋值。
但我仔细检查了没有不完整的数据结构。
例如,无法转换以下结构:
谁接受这个挑战,以帮助修改代码,使之编译。git仓库的代码可以随意克隆和修改:
git code
C language BNF
我正在练习使用Spirit x3解析C language并将其存储在自定义数据结构中。
但我遇到了巨大的困难,5天后仍然无法编译。
提示的大多数错误都是不完整的结构,无法进行赋值。
但我仔细检查了没有不完整的数据结构。
例如,无法转换以下结构:
谁接受这个挑战,以帮助修改代码,使之编译。git仓库的代码可以随意克隆和修改:
git code
C language BNF
1条答案
按热度按时间nbnkbykc1#
但我仔细检查了没有不完整的数据结构。
投诉的不是这个。它说的是“不兼容”,而不是“不完整”。有些东西是不会改变的。
使用此临时CMakeLists.txt
经过几次清理/审查提交后,我最终发现了第一个与传播相关的错误,
您可以从错误消息here中的rule标记中看出:
rule_def.hpp|214 col 5| required from ‘bool parse::parse_rule(boost::spirit::x3::detail::rule_id<
init_declarator_class
>, Iterator&, const Iterator&, const Context&, boost::spirit::x3::rule<?>::attribute_type&) [with Iterator = const char*; Context = boost::spirit::x3::context<?>; boost::spirit::x3::rule<?>::attribute_type = ast::test::init_declarator]’
AST为:
我能理解你的期望,但精神不能:
/home/sehe/custom/superboost/libs/spirit/include/boost/spirit/home/x3/support/ast/variant.hpp|184 col 17| error: no match for ‘operator=’ (operand types are ‘boost::spirit::x3::variant<ast::test::init_declarator_1, boost::spirit::x3::forward_ast<ast::test::declarator> >::variant_type’ and ‘
boost::fusion::deque<ast::test::declarator,ast::test::initializer>’)
如何将
fusion::deque<...>
分配给init_declarator_1
?我知道你改编了它,但X3没有上下文线索来合成什么。明确规则:现在它可以编译了,下一个问题出现在
selection_statement_class
中。从这里开始冲洗并重复。摘要
检查您的属性兼容性。理想情况下,从SMALL子语法开始,只前进到更高级别的产生式IFF,低级别的产生式都能正确地编译和传播。
你可能会注意到这是测试驱动编程的基本原则。如果你不限制范围来寻找上下文,你就不能指望在错误小说中找到自己的路。
奖金
请注意,我倾向于使用a type-coercion facility来使上面的操作更容易:
现在,您可以编写上面的匿名规则,如
当你去修复
selection_statement
时,请帮自己一个忙,不要再使用像selection_statement_1
这样令人费解的名字。我们是人类,不是代码生成器。你真正需要的是这样的规则:
要匹配的AST:
PEG语法不是BNF。此外,Spirit是一个用于解析器规范的eDSL。你的目标不是机器翻译,而是一个可维护的、高效的解析器生成器。