使用参考手册语法对Ada 2005 Scoped标识符进行Pyparsing时的堆栈溢出

时间:2013-03-15 16:55:53

标签: python stack-overflow grammar ada pyparsing

我目前正在使用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())并始终使规则失败。

    < / LI>

Recursive expressions with pyparsing可能与我的问题有关。

问题似乎也与Need help in parsing part of python grammar密切相关  遗憾的是还没有答案。

这是导致无限递归的Ada 2005语法规则循环:

请注意,此问题不是特定于Ada的问题,但与包含左递归规则的所有语法有关。

1 个答案:

答案 0 :(得分:1)

供参考,如GNAT: The GNU Ada Compiler中所述,§2.2 The Parser,“[{3}}中给出的Ada语法不明确,并且表格驱动的解析器将被强制修改语法使LL(1)或LALR(1)技术可以接受。“