问题标签 [lalr]

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.

0 投票
1 回答
145 浏览

compiler-construction - 关于 SLR、LALR 的语法和一些挑战

我知道:

如果一种语言可以由 LL(1) 语法生成,则称该语言为 LL(1)。可以证明 LL(1) 文法是

但我遇到了一个问题。

为什么语法

S-> aBDb

B -> 拉姆达

D-> dD | 拉姆达

为什么这个语法不是 LL(1) 也不是 SLR 也不是 LALR?谁能形容我?

0 投票
2 回答
3078 浏览

parsing - SLR(1) 和 LALR(1) 和减少

我很困惑 完全正确!!!!!!!

我在我的一篇教授笔记中阅读了以下示例。

1) 我们有一个 SLR(1) 语法 G,如下所示。我们使用 SLR(1) 解析器生成器并为 G 生成解析表 S。我们使用 LALR(1) 解析器生成器并为 G 生成解析表 L。

解:S中带有R(reduce)的元素数量多于L。

但在一个网站上我读到:

2) 假设 T1、T2 是用语法 G 的 SLR(1) 和 LALR(1) 创建的。如果 G 是 SLR(1) 语法,以下哪项是正确的?

a) T1 和 T2 没有任何区别。

b) T1 中非错误条目的总数低于 T2

c) T1 中的错误条目总数低于 T2

解决方案:

LALR(1) 算法生成的状态与 SLR(1) 算法完全相同,但它可以生成不同的动作;它能够解决比 SLR(1) 算法更多的冲突。但是,如果文法是 SLR(1),则两种算法将产生完全相同的机器(a 是正确的)。

任何人都可以为我描述其中哪些是真实的?

编辑:事实上,我的问题是为什么对于给定的 SLR(1) 语法,LALAR(1) 和 SLR(1) 的解析表完全相同,(错误和非错误条目相等,reduce 的数量相等)但是对于上面的文法,S 中 Reduced 的个数要多于 L。

我在另一本书中看到,我们通常有:

在此处输入图像描述

概括:

1)对于我在问题1中写的上述语法,为什么减少的数量不同?

2)如果我们有一个 SLR(1) 语法,为什么表是完全一样的?(减少和错误条目的数量变得相同)

0 投票
2 回答
3441 浏览

c - 如何通过“win_flex bison”编写纯解析器和可重入扫描器?

我写了一个解析器来评估一个逻辑表达式。我知道 flex 和 bison 使用全局变量(如 yylval)。我想要一个用于线程编程的纯解析器和可重入扫描器。我的“.y”文件在这里:

我的“.y”文件在这里:

我已经添加%pure_parser到这两个文件中,将 yylex 声明更改为int yylex (YYSTYPE* lvalp);并替换yylval*lvalp,但我看到了一个错误:'lvalp' is undeclared identifier.. 关于“可重入”和“纯”的例子很多,但我找不到最好的指导方针。

有人可以指导我吗?

提前致谢。

0 投票
1 回答
2601 浏览

parsing - LALR 解析器和前瞻

我无缘无故地实现了 LALR 解析表的自动构建。这个解析器有两种风格,LALR(0) 和 LALR(1),其中的数字表示预读的数量。

我对前瞻意味着什么感到困惑。

如果我的输入流是“abc”并且我有以下产品,我需要 0 前瞻还是 1?

同样的问题,但我无法通过仅查看输入中的“a”来提前选择正确的 P 产品。

我还有另外的困惑,因为我认为在构建 LALR 解析器生成器时不会真正发生后一种 P-production。原因是当我们计算闭包时,语法会自动有效地左分解。

正在浏览此页面并且没问题,直到我进入第一/后续部分。我的问题是我不知道我们为什么要计算这些东西,所以我很难在脑海中抽象出这个。

我几乎明白,前瞻与改变输入无关,而是决定何时减少

我一直在读《龙》的书,但它和塔伦蒂诺的剧本一样线性。对于已经知道如何做到这一点的人来说,这似乎是一个很好的参考。

0 投票
1 回答
196 浏览

parsing - 使用 YESCC 解析基于缩进的语法(如 Python)

我有以下代码:

我的自定义标记器转换为:

但是我无法使用以下 Yecc 解析它:

它给了我以下输出:

非常欢迎任何帮助,谢谢。

0 投票
5 回答
14631 浏览

c++ - 在 C++ 中生成 AST

我正在用 C++ 制作解释器,到目前为止,我已经让我的词法分析器生成标记。问题是我不确定如何生成“walk”解析树。

我正在考虑使用数组数组制作我的解析树,但我不确定如何以正确的顺序将标记实际插入到解析树中。

我不确定是自上而下、从左到右还是自下而上、从右到左。

谁能给我一个简单的 LALR(1) 算法?

0 投票
1 回答
332 浏览

compiler-construction - 编译器中的项集和 SLR(1) 问题

我遇到了一个由我们的助教解决的旧考试问题。任何人都可以帮助我吗?

当我们创建SLR(1)关于S--> aSb | a语法时,其中一个项目集LR(0)如下所示:

{ S-->a.Sb, S-->a., S-->.aSb, S-->.a}

关于从上述集合中提取的规则,其中哪些是 True:

任何人都可以说为什么(3)是正确的?关于这个问题的一些细节?

编辑:我认为 Goto 指的是 Action 和 goto 表。 在此处输入图像描述

0 投票
1 回答
148 浏览

yacc - 移位/减少与中缀部分的冲突

我在使用包含普通中缀操作和中缀部分的语法的类似 yacc 的实现(特别是使用 ocamlyacc)时遇到问题,例如在 Haskell 中。我希望所有这些都符合语法:

但是,即使摆弄关联性/优先级声明,我也无法使其正常工作。我可以在 Grammar.output 中看到问题发生的位置(它正在转移到我希望它减少的地方),但我无法哄它按照我想要的方式运行。这是该问题的简化演示。

lex.mll 有:

main.ml 有:

和 parse.mly (问题出在哪里)有:

运行ocamlyacc它告诉我有1 shift/reduce conflict。特别是这里是详细日志的相关部分:

运行编译后的程序将正确解析以下所有内容:

但失败:

另一方面,如果我创建一个HIGH具有高优先级的虚拟令牌:

然后穿上%prec HIGH规则 9:

在这种情况下(1+2)会解析但(1+)不会。

我了解移位/减少冲突的一般背景。我只是不知道如何协商它来解决这个解析挑战。

0 投票
1 回答
108 浏览

parsing - 在 Lemon 中使用 midaction 规则来解释“let”表达式

我正在尝试使用 Flex + Lemon 编写一个“玩具”解释器,它支持非常基本的“let”语法,其中变量 X 临时绑定到表达式。例如,“letx 3 + 4 in x + 8”应计算为 15。

本质上,我“喜欢”的规则是:

但这不起作用,因为在分配O之前进行了评估。X = N

我知道通常的解决方案是中间规则行动。Lemon 没有明确支持这一点,但我在其他地方读到过无论如何都只是语法糖

因此,我尝试制定一个中期规则行动,X = N在解释之前完成我的任务O

但这不起作用,因为midruleaction规则无法访问N,或者至少我在柠檬文档/示例中看不到。

我想我在这里遗漏了一些东西。我知道我可以建造一棵树,然后再走一遍。我可能最终会这样做,但我想先了解如何更直接地解决这个问题。

有什么建议么?

0 投票
1 回答
884 浏览

compiler-construction - Bison - 一元运算符何时真正需要 %prec?

我目前是第一次玩 Flex 和 Bison。我已经阅读了Bison 手册页上的上下文优先级。试图在不使用%prec指令的情况下构建一个最小的示例,因为我不太熟悉它的实际作用。这是我的最小示例。

弹性文件

野牛文件

主 cpp 文件

我没有做过深度测试,但是对于我能想到的每一个使用一元减号的组合,我得到了正确的结果。我只是那么幸运,还是%prec只在某些特殊情况下才需要该指令?当需要指令时,我也会欣赏示例,这样我就可以自己评估堆栈上的移位和减少。

谢谢