问题标签 [recursive-descent]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
parsing - LL1 第一和跟随规则
我正在为 LL(1) 语法构建一个解析表,这一切都有意义,除了一个方面!?
下面的规则设置接缝冲突。
• 对于每个产生式 X → αAβ,将 FIRST (β) - {€} 放入 FOLLOW(A)
• 如果 € 在 FIRST (β) 中,则将 FOLLOW(X) 放入 FOLLOW(A)
它们是规则 1 和 2(3 不是问题)。
如果生产规则不符合规则 1,您如何实施规则 2?
那么有人可以巧妙地解释哪条规则适用于哪里吗?
java - 为我的语法编写递归后代解析器
我必须使用 Recursive Descendent Parser Builder 构建表达式。
这是我的语法:
现在,我有一个复合结构,每个终端都有一个类,我正在尝试按照上述语法规则来构建它。
这个想法是我需要一个用于每个语法规则的方法,并且每个方法都必须构建表达式树的一部分。
虽然它适用于更简单的语法(例如,只允许布尔表达式的语法),但我遇到了一些问题。
主要问题来自于expr
规则,它强制我使用 + 和 - 的一元版本,允许这样的表达式+3-4
。这需要我找出何时必须将操作数视为一元以及何时视为二进制!
这是我的 Builder 类的代码。请注意,有些东西是意大利语的,但我已经使用评论解释了一切,甚至是我的问题。另请注意,有一行我使用了伪代码,所以这一行不可编译!
已知问题:
(a<=b && c>1) || a==4
评估为a <= b && c > 1
a==[-4]
评估为a == a - 4
-4+3>c-2
评估为+3 > c - 2
可能还有更多错误,但这些是最常见的。
所以这是我的问题:
首先,你认为这段代码有一些逻辑问题吗?我的意思是,它是按照语法所说的还是我做错了什么?您将如何修复该expr
方法以使其适用于一元和二进制 + 或 - 操作数?
如果我的代码完全错误,是否有人可以帮助我编写工作版本?正如你在类名中看到的,这是我写的第六个实现,我真的不知道接下来要做什么!
谢谢。
python - 递归 dir() 一个 python 对象以查找某种类型或具有某个值的值
我有一个复杂的 Python 数据结构(如果重要,它是一个大的 music21 Score 对象),由于对象结构深处某处存在弱引用,它不会腌制。我以前用堆栈跟踪和python调试器调试过这样的问题,但这总是一个很大的痛苦。是否有一种工具可以在对象的所有属性上递归运行 dir(),查找隐藏在列表、元组、字典等中的对象,并返回与某个值匹配的对象(lambda 函数或类似的东西)。一个大问题是递归引用,因此需要某种备忘录功能(如 copy.deepcopy 使用)。我试过:
我可能可以继续填补这个漏洞(例如,iter不是我想要的 dicts),但在我投入更多时间之前,想知道是否有人知道更简单的答案。它可能是一个非常有用的通用工具。
sql - tsql循环表之间的父子关系
我有一张这样的桌子:
我需要像这样总结 al 数量加上儿子数量:
我的麻烦是因为父子之间的关系是递归的,所以我想把他的祖父数量等相加……我不知道最大深度,比我不能加入很多次。
我能做些什么?谢谢你。
c++ - 解析全括号表达式
我正在尝试为这个语法解析一个带括号的 Exp:
...但我有一个问题:当我输入“1+4”时,没有出现错误。我该如何解决?
antlr - 基于递归下降的计算器堆栈溢出
TL;博士:
我的计算器语法依赖于递归下降将括号组相互嵌套,但是嵌套括号过多(大约 20 个)会导致堆栈溢出。我怎样才能解决这个问题?有没有办法让问题更平坦?
长表:
不久前——我的脑袋深深陷入了小型嵌入式系统——没有半个大脑的人不应该遇到堆栈溢出。现在被一项更抽象的任务所困扰,我来这里寻求建议。
激励项目是一个适用于 Android 的计算器。当前的计算器在很多方面都明显不足,但我今天没有带我的肥皂盒,所以我直接解决我遇到的问题:堆栈溢出!
具体来说,当用户创建了太多嵌套的括号组时,包括函数等。这是因为我的计算器依赖于ANTLR
语法,这意味着它使用递归下降。方便的是,这允许它通过 PEMDAS 连续运行,从而可以轻松计算嵌套函数和括号。但!我发现 - 根据手机 - 按下括号按钮 20 次左右会导致崩溃,这是由调用堆栈引起的堆栈溢出引起的,大约 100 次函数调用深度,这是递归下降方法的自然结果。
我知道,平面比嵌套更好,但它所经历的 4 个级别(函数)是完全必要的,而其他几个级别使我的生活对数更容易。即使删除这些级别也不能解决问题:用户仍然能够在几分钟内导致系统崩溃。有一个“太多的括号!” 错误消息很糟糕(这是其他计算器之一会做的事情)。另外,我使用 AST 输出来格式化输入字符串,使其看起来非常漂亮,因此预先计算括号组会使整个系统有点过于复杂。
所以,问题:
即使问这个问题似乎也很愚蠢,但是:有没有办法在 ANTLR 中实现一个语法,可以解析和解释复杂且深度嵌套的表达式,而不会爆炸调用堆栈?
语法:
antlr - 如何获得由该语法解析的 (A*B)>C 字符串?
问题是因为 -- addExpression ((EQ | NE | GT | LT | LE | GE) addExpression)+ --- 。通过这样做,我想过滤掉单独的数学表达式,除非后面跟着一个关系以使其整体合乎逻辑......我不希望我的解析器单独解析数学表达式......
测试:
c - 递归下降解析器C程序
我有以下语法,需要用 C 编写递归下降解析器
我使用左分解得到以下语法
现在,我消除了左递归以获得以下语法
e 表示ε
现在我已经为这个语法编写了 C 程序,但是我遇到了分段错误
regex - 如何消除上下文无关语法中的左递归?
我将如何消除此 CFG 中的左递归?
context-free-grammar - 需要帮助从 CFG 中消除左递归
我将如何消除此 CFG 中的左递归?
我想出了这个:
但似乎,当我尝试将其实现为递归下降解析器并解析诸如“ab”之类的简单字符串时,我得到了由concat
生产引起的无限循环。
我是否错误地消除了左递归?