- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何识别文法是 LL(1)、LR(0) 还是 SLR(1)?
任何人都可以使用这个示例或任何其他示例来解释它吗?
X → Yz | a
Y → bZ | ε
Z → ε
最佳答案
要检查语法是否为 LL(1),一种选择是构造 LL(1) 解析表并检查是否有任何冲突。这些冲突可能是
让我们通过为每个非终结符构建 FIRST 和 FOLLOW 集来尝试一下您的语法。在这里,我们明白了
FIRST(X) = {a, b, z}
FIRST(Y) = {b, epsilon}
FIRST(Z) = {epsilon}
我们还知道 FOLLOW 集是
FOLLOW(X) = {$}
FOLLOW(Y) = {z}
FOLLOW(Z) = {z}
据此,我们可以构建如下的LL(1)解析表:
a b z $
X a Yz Yz
Y bZ eps
Z eps
由于我们可以构建没有冲突的解析表,因此语法为 LL(1)。
为了检查语法是 LR(0) 还是 SLR(1),我们首先为该语法构建所有 LR(0) 配置集。在这种情况下,假设 X 是您的起始符号,我们得到以下结果:
(1)
X' -> .X
X -> .Yz
X -> .a
Y -> .
Y -> .bZ
(2)
X' -> X.
(3)
X -> Y.z
(4)
X -> Yz.
(5)
X -> a.
(6)
Y -> b.Z
Z -> .
(7)
Y -> bZ.
由此可见,该文法不是LR(0),因为状态(1)存在移位/归约冲突。具体来说,因为我们有移位项 X → .a 和 Y → .,所以我们无法判断是移动 a 还是减少空字符串。更一般地说,没有 ε-产生式的文法是 LR(0)。
但是,这个文法可能是SLR(1)。为了看到这一点,我们使用特定非终结符的前瞻集来增强每次归约。这返回了这组 SLR(1) 配置集:
(1)
X' -> .X
X -> .Yz [$]
X -> .a [$]
Y -> . [z]
Y -> .bZ [z]
(2)
X' -> X.
(3)
X -> Y.z [$]
(4)
X -> Yz. [$]
(5)
X -> a. [$]
(6)
Y -> b.Z [z]
Z -> . [z]
(7)
Y -> bZ. [z]
状态 (1) 中的移位/归约冲突已被消除,因为我们仅在前瞻为 z 时进行归约,这不会与任何其他项冲突。
关于parsing - 如何判断一个文法是LL(1)、LR(0)还是SLR(1)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8496642/
我正在尝试实现一个表达式处理语法(处理嵌套括号和其他内容)。到目前为止我有以下内容,但它们无法处理某些情况(成功/失败情况出现在以下代码块之后)。有人知道这是怎么回事吗? 注意:varname +=
我在 ANTLR 语法中写下了以下语句: loopStatement : 'loop' (statement|exit)* 'end' 'loop' ';' ; 如果我没理解错的话,
为 C 的一个子集编写一个简单的 BNF 语法,它支持多个语句,包括赋值、if-else 和没有 block 语句的 while 语句。为你的非终结符使用有意义的名字(相对于神秘的字母)。假设变量由单
我正在尝试为以下语法创建一个 LALR(1) 解析器并发现一些移位/归约冲突。 S := expr expr := lval | ID '[' expr ']' OF expr lval := ID
根据这个paper的规则: If A is the start nonterminal, put EOF in FOLLOW(A) Find the productions with A on the
为 k > 1 制作人工 LR(k) 文法很容易: Input: A1 B x Input: A2 B y (introduce reduce-reduce con
在使用 make 和 bison 的项目中,我很难指定编译语法 grammar.tab.c 依赖于语法输入 grammar.y,每个目标文件都依赖于相应的源文件(包括 grammar.tab.o),并
我正在尝试从语法分析树中提取乔姆斯基范式 (CNF) - 句子的语法产生式: (ROOT (S (NP (DT the) (NNS kids)) (VP (VBD opened)
我知道 ANTLR 可以接受 LL(*) 文法。但是,有没有办法使用 ANTLR 检查语法是否是 LL(1)? 最佳答案 options { k = 1; } 如果您的语法不在 LL(1) 中,
我还没有找到答案。是否存在无法转换为 LL(1) 的上下文无关且无歧义的语法? 我发现了一个我不知道如何转换为 LL(1) 的作品:parameter-type-list C99中的生产: param
我是一名优秀的程序员,十分优秀!