2

我目前正在使用 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 语法规则循环:

请注意,这个问题不是 Ada 特有的问题,而是与所有包含左递归规则的语法有关。

4

1 回答 1

1

作为参考,如GNAT: The GNU Ada Compiler , §2.2 The Parser中所述,“[in] ARM中给出的 Ada 语法是模棱两可的,表驱动的解析器将被迫修改语法以使其为 LL 所接受(1) 或 LALR (1) 技术。”

于 2013-03-21T10:20:43.303 回答