我目前正在使用 Pyparsing 和参考手册语法规则实现 Ada 2005 解析器。我们需要它来分析我们老化的 Ada 代码库的部分并将其转换为 C/C++。
大多数事情都有效。
但是,仍然存在一个令人讨厌的小问题:
name
解析范围标识符(规则selected_component)(例如表达式)时的语法规则"Global_Types.Integer2"
失败,因为它是左关联语法规则循环的一部分。
我认为这条规则写错了: sub-ruledirect_name
应该放在 sub-rule 之后direct_name
。事实上,它应该放在替代品列表的最后。否则direct_name
,依次name
匹配并且"Global_Types"
仅然后期望字符串在那之后结束。不是我想要的。
因此,我现在将规则direct_name
移至 -alternatives 的末尾name
......但随后我得到了 Pyparsing 无限递归,Python 吐出超出的最大递归深度。
我相信这个问题是由以下事实引起的
语法规则selected_component的关联性是right-to-left。我搜索了 Pyparsing 的参考手册,但没有找到任何相关内容。我们应该将 dot (
.
) 视为具有从右到左关联性的运算符,还是可以通过语法规则的扩展和重组来解决它?或者因为在 Pyparsing 无限递归中没有检查。我相信这不会太难实现。使用从当前活动规则(函数)到源位置/偏移量 (
getTokensEndLoc()
) 的映射,并且如果当前源输入位置/偏移量等于与刚刚输入的规则相关的位置,则始终使规则失败。
pyparsing 的递归表达式可能与我的问题有关。
该问题似乎也与需要帮助解析部分python语法密切相关 ,不幸的是还没有答案。
这是导致无限递归的 Ada 2005 语法规则循环:
- 名字=>
- selected_component =>
- 前缀=>
- 姓名
请注意,这个问题不是 Ada 特有的问题,而是与所有包含左递归规则的语法有关。