首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在proper语法分析中进行适当的递归?

如何在proper语法分析中进行适当的递归?
EN

Stack Overflow用户
提问于 2020-06-08 11:55:00
回答 1查看 92关注 0票数 4

我目前正在解析一种自定义编程语言,当创建用于解析的“表达式”规则时,我很难找到一种不让递归慢得令人痛苦的方法。我的问题是函数调用可以在表达式中,表达式可以在函数调用(参数)中。因此,我最后得到的是一个基于Forward()的糟糕的系统,在func1(var1+1) + 1上花费秒,在func1(func1(var1+1)+1) + 1上花费几分钟,这肯定是不可接受的。下面是我目前的糟糕做法:

代码语言:javascript
复制
    expression = Forward()
    functionCall = Forward()
    value = literal ^ identifier ^ Group(functionCall)
    expression << Group(infixNotation(value, [
        (memberOP, 2, opAssoc.LEFT),
        ...
    ]))
    arguments = ZeroOrMore(delimitedList(expression))

    ...

    functionCall << identifier + Literal("(").suppress() + Group(arguments) + Literal(")").suppress()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-08 12:20:00

PyParsing可以记住以前的解析结果,并使用Packrat优化来重用它们。这为递归语法提供了性能好处,通常情况下,如果一个元素可以应用于不同的上下文中。

必须手动启用Packrat,因为它可能与具有副作用的解析器(例如修改全局状态的解析操作)发生冲突。

代码语言:javascript
复制
import pyparsing
pyparsing.ParserElement.enablePackrat()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62261495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档