问题标签 [ll]
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 - LL(1) 解析器中 FIRST 和 FOLLOW 集的用途?
谁能向我解释在 LL(1) 语法中应该如何使用 FIRST 和 FOLLOW ?我知道它们用于语法表构建,但我不明白如何。
context-free-grammar - 找到一个 LL(1) 语法?
我如何找到该语言的 LL(1) 语法:
L=a m b n c m+n
其中 m 和 n 是自然元素的元素?我的上下文无关语法是:
S → AB
A → acA | 交流
B → bcB | 公元前
谁能告诉我我是否走在正确的轨道上?
编辑:我的新 CFG 是
S → aSc | 乙
B → bBc | 公元前
但是我认为我可能对 LL(1) 有一个错误,因为 B 的两个推导都以 b 开头。这是正确的吗?
编辑 谢谢你我想我明白了:
S → aSc | 乙
B → bBc | 拉姆达
parsing - 在语法中查找 FIRST 集
今天我正在阅读如何找到语法的First和Follow。我看到了这个语法:
S → ACB | 中央银行 | 巴
A → 大 | 公元前
B → g | ε
C → h | ε
声称是
FIRST(S) = FIRST(ABC) U FIRST(CbB) U FIRST(Ba)
= {d, g, h, ε} U {h, b} U {g, a}
= {d, g, h, ε, b, a}
我不明白这个集合中的 a 和 b 是如何的。谁能解释一下?
compiler-construction - 删除可为空的产生式
我正在为pascal的一个子集创建一个词法分析器,这是编译器红龙教科书后面推荐的一个编程项目。我正在将语法更改为 LL,以便创建解析表。我忽略了悬而未决的其他歧义,并相信这是唯一存在的歧义。我刚刚删除了所有的 epsilon 产品。在我继续左分解之前,我想要一些关于我是否正确删除了 epsilon 产生式的反馈。我已经盯着这个看了很长一段时间,所以真的不确定我是否错过了一些会在以后引起问题并且没有人检查的东西。我知道这是一个很长的帖子,我真的不知道还有什么地方可以让知道的人检查一下。我真的很感谢你的时间!
原文语法:
语法后ε产生消除
当然,第二种语法明显不同。我通过查找对它的引用并创建一个 | 删除了所有 epsilon 产生式。有和没有它的选项。当删除 epsilon 只在生产中留下一条生产线时,我完全删除了该生产并将该生产线移动到之前调用生产的任何位置。例如,我通过更改以下方式完全消除了这种方式:
至
parsing - 这是 LL(1) 语法吗?
考虑命题逻辑的以下语法:
连接词的优先级是:-、/\、/、->、<->。
还考虑了关联性,例如p\/q\/r
应该与 相同p\/(q\/r)
。其他连接物也是如此。
我假装在 java 中制作了一个预测性的自上而下的解析器。我在这里没有看到歧义或直接左递归,但不确定我是否只需要考虑这是一个 LL(1) 语法。也许是非直接左递归?
如果这不是 LL(1) 语法,那么根据我的意图转换它所需的步骤是什么?
parsing - Problems with LL algorithms taxonomy
I am working on Context Free Grammars and I am stuck into the first step: understanding how Top-Down parsing algorithms are structured.
My problem revolves around top-down parsers. And I have three algorithms that were introduced to me:
- Recursive Descent
- Predictive
- Predictive Recursive Descent
Questions
But do not understand how to relate them. So please answer the following questions:
- Is it true that Recursive Descent is based on backtracking and inefficient?
- Is it true that Predictive parsing is a completely different algorithm from the other two?
- Is it true that Predictive Recursive Descent is a particular kind of recursive descent algorithm but without backtracking?
- Is it true that Predictive algorithms use parse-tables and Recursive Descent do not? Is it true that Predictive Recursive Descent algorithms use a predictive parse table (sort of enhanced parse table)?
Also please answer this question:
- Which algorithm LL parsers use? Predictive, Predictive Recursive Descent or Recursive Descent?
Thank you
parsing - LL-1 解析器:FOLLOW-Set 真的有必要吗?
据我了解,如果输入流中存在错误,FOLLOW-Set 会在第一时间告诉我。那正确吗?
因为否则我想知道您实际上需要它做什么。考虑您的解析器在堆栈顶部有一个非终端(在我们的课程中,我们使用堆栈作为 LL-Parsers 的抽象)
IE
X - 让它成为一个非终端 - 将在下一步中被替换,因为它位于堆栈的顶部。因此解析器询问解析表对 X 使用什么推导。考虑输入是
where+
和b
are 都是终端。
假设 X""
在其 FIRST 集中有 ie 空字符串。它+
在他的第一组中没有。
据我在这种情况下看到的,解析器可以简单地检查+
在第一组 X 中没有,然后使用让 X 分解为""
空字符串的推导,因为这是解析器可能如何做到的唯一方法继续解析输入而不抛出错误。如果输入流无效,解析器无论如何都会在稍后的某个时刻识别它。我知道 FOLLOW 集可以帮助在这里立即确定解析是否可以继续而没有错误。
我的问题是 - 这真的是 FOLLOW 集所扮演的唯一角色吗?
我希望我的问题属于这里 - 如果不是,我很抱歉。如果有不清楚的地方,也可以随时要求澄清。
先感谢您
parsing - 从 Wikipedia 上的文章来看,这是 LL(0) 语法吗?
我正在研究 LL/LR 解析,在阅读Wikipedia 上的 LL 解析器页面时,我发现了这个语法:
从文章来看,它是 LL(我从表中假设为 LL(0));但我找到了一个证明,表明 LL(0) 解析器没有左递归(在这种情况下是 S)。那么,为什么这是一个正确的 LL(0)(或者至少,这是我从文章中理解的)。
“无左递归”是某种一般规则还是只是可能问题的标志?
解析表能否确定我正在研究的语法是否为 LL(0)?
parsing - 一个 LL(1) 文法可以有多个以同一个非终结符开头的规则吗?
给定一个由定义的文法 G
这是文法 LL(1) 吗?
我意识到我们可以将其压缩成一行,但这不是这个问题的重点。
主要是,一个 LL(1) 文法可以有多个以同一个非终结符开头的规则吗?
作为后续问题,如何为上述语法构建解析表?
我已经解决了以下问题:
我看了这篇文章,但不明白他们是如何从 FIRST 和 FOLLOW 变成一张桌子的。
compiler-construction - 从上下文无关语法中删除循环递归
我正在尝试解决将这个 CFG 写入 LL(1) 解析表的问题。然而,问题是它在 L/A 之间有循环左递归,我找不到任何资源来解释如何做到这一点。
这是有问题的CFG:
谁能帮助解释如何从语法中删除这个循环?谢谢!