我目前正在使用Pyparsing和参考手册语法规则实现Ada 2005解析器。我们需要这个来分析和转换我们老化的Ada-codebase的部分内容到C / C ++。
大多数事情都有效。
然而,仍有一个令人烦恼的问题:
解析作用域标识符(规则 selected_component )时的语法规则name
失败,例如表达式"Global_Types.Integer2"
失败,因为它是左关联语法规则循环的一部分。 / p>
我认为此规则编写错误:子规则direct_name
应放在子规则direct_name
之后。事实上,它应该放在替代品列表的最后。否则,direct_name
并且name
仅匹配"Global_Types"
,然后期望字符串在此之后结束。不是我想要的。
因此我现在将规则direct_name
移到name
的末尾 - 备选方案......但后来我得到了一个Pyparsing无限递归,并且Python吐出超出的最大递归深度。
我认为问题是由
引起的语法规则 selected_component 的关联性是从右到左。我搜索了Pyparsing的参考手册,但没有发现任何相关内容。我们应该将dot(.
)视为具有从右到左关联性的运算符,还是可以通过扩展和重构语法规则来解决它?
或者没有检查Pyparsing无限递归的事实。我相信这不会太难实现。如果当前源输入位置/偏移量等于与刚刚输入的规则相关的位置,则使用当前活动规则(函数)中的映射来源位置/偏移量(getTokensEndLoc()
)并始终使规则失败。
Recursive expressions with pyparsing可能与我的问题有关。
问题似乎也与Need help in parsing part of python grammar密切相关 遗憾的是还没有答案。
这是导致无限递归的Ada 2005语法规则循环:
请注意,此问题不是特定于Ada的问题,但与包含左递归规则的所有语法有关。
答案 0 :(得分:1)
供参考,如GNAT: The GNU Ada Compiler中所述,§2.2 The Parser,“[{3}}中给出的Ada语法不明确,并且表格驱动的解析器将被强制修改语法使LL(1)或LALR(1)技术可以接受。“