gpt4 book ai didi

python - 使用引用手册语法 Pyparsing Ada 2005 范围标识符时的堆栈溢出

转载 作者:太空宇宙 更新时间:2023-11-04 06:16:19 25 4
gpt4 key购买 nike

我目前正在使用 Pyparsing 和引用手册语法规则实现 Ada 2005 解析器。我们需要它来分析我们老化的 Ada 代码库的一部分并将其转换为 C/C++。

大多数事情都有效。

但是,还有一个烦人的小问题:

语法规则 name 在解析作用域标识符时(规则 selected_component)例如表达式 "Global_Types.Integer2" 失败,因为它是部分左结合语法规则循环。

我认为这条规则写错了:子规则 direct_name 应该放在子规则 direct_name 之后。事实上,它应该放在备选方案列表的最后。否则 direct_namename 匹配并且仅匹配 "Global_Types" 然后期望字符串在那之后结束。不是我想要的。

因此,我现在将规则 direct_name 移动到 name-alternatives 的末尾......但是我反而得到了一个 Pyparsing 无限递归,Python 吐出最大递归深度超过。

我认为问题是由以下事实引起的

  • selected_component 语法规则的关联性是从右到左。我搜索了 Pyparsing 的引用手册,但没有找到任何相关内容。我们应该将点(.) 视为具有从右到左结合性的运算符,还是可以通过语法规则的扩展和重组来解决?

  • 或者 Pyparsing 无限递归中没有检查这一事实。我相信这不会太难实现。使用从当前事件规则(函数)到源位置/偏移量 (getTokensEndLoc()) 的映射,如果当前源输入位置/偏移量等于与刚刚输入的规则相关的位置,则规则始终失败。

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

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

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

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

最佳答案

供引用,如 GNAT: The GNU Ada Compiler 中所述, §2.2 The Parser ,“[在] ARM 中给出的 Ada 文法是不明确的,表驱动解析器将被迫修改文法以使其为 LL (1) 或 LALR (1) 技术所接受。”

关于python - 使用引用手册语法 Pyparsing Ada 2005 范围标识符时的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15438015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com