问题标签 [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.
compiler-construction - 关于 SLR、LALR 的语法和一些挑战
我知道:
如果一种语言可以由 LL(1) 语法生成,则称该语言为 LL(1)。可以证明 LL(1) 文法是
但我遇到了一个问题。
为什么语法
S-> aBDb
B -> 拉姆达
D-> dD | 拉姆达
为什么这个语法不是 LL(1) 也不是 SLR 也不是 LALR?谁能形容我?
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) 语法,为什么表是完全一样的?(减少和错误条目的数量变得相同)
c - 如何通过“win_flex bison”编写纯解析器和可重入扫描器?
我写了一个解析器来评估一个逻辑表达式。我知道 flex 和 bison 使用全局变量(如 yylval)。我想要一个用于线程编程的纯解析器和可重入扫描器。我的“.y”文件在这里:
我的“.y”文件在这里:
我已经添加%pure_parser
到这两个文件中,将 yylex 声明更改为int yylex (YYSTYPE* lvalp);
并替换yylval
为*lvalp
,但我看到了一个错误:'lvalp' is undeclared identifier.
. 关于“可重入”和“纯”的例子很多,但我找不到最好的指导方针。
有人可以指导我吗?
提前致谢。
parsing - LALR 解析器和前瞻
我无缘无故地实现了 LALR 解析表的自动构建。这个解析器有两种风格,LALR(0) 和 LALR(1),其中的数字表示预读的数量。
我对前瞻意味着什么感到困惑。
如果我的输入流是“abc”并且我有以下产品,我需要 0 前瞻还是 1?
同样的问题,但我无法通过仅查看输入中的“a”来提前选择正确的 P 产品。
我还有另外的困惑,因为我认为在构建 LALR 解析器生成器时不会真正发生后一种 P-production。原因是当我们计算闭包时,语法会自动有效地左分解。
我正在浏览此页面并且没问题,直到我进入第一/后续部分。我的问题是我不知道我们为什么要计算这些东西,所以我很难在脑海中抽象出这个。
我几乎明白,前瞻与改变输入无关,而是决定何时减少。
我一直在读《龙》的书,但它和塔伦蒂诺的剧本一样线性。对于已经知道如何做到这一点的人来说,这似乎是一个很好的参考。
parsing - 使用 YESCC 解析基于缩进的语法(如 Python)
我有以下代码:
我的自定义标记器转换为:
但是我无法使用以下 Yecc 解析它:
它给了我以下输出:
非常欢迎任何帮助,谢谢。
c++ - 在 C++ 中生成 AST
我正在用 C++ 制作解释器,到目前为止,我已经让我的词法分析器生成标记。问题是我不确定如何生成“walk”解析树。
我正在考虑使用数组数组制作我的解析树,但我不确定如何以正确的顺序将标记实际插入到解析树中。
我不确定是自上而下、从左到右还是自下而上、从右到左。
谁能给我一个简单的 LALR(1) 算法?
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 表。
yacc - 移位/减少与中缀部分的冲突
我在使用包含普通中缀操作和中缀部分的语法的类似 yacc 的实现(特别是使用 ocamlyacc)时遇到问题,例如在 Haskell 中。我希望所有这些都符合语法:
但是,即使摆弄关联性/优先级声明,我也无法使其正常工作。我可以在 Grammar.output 中看到问题发生的位置(它正在转移到我希望它减少的地方),但我无法哄它按照我想要的方式运行。这是该问题的简化演示。
lex.mll 有:
main.ml 有:
和 parse.mly (问题出在哪里)有:
运行ocamlyacc
它告诉我有1 shift/reduce conflict
。特别是这里是详细日志的相关部分:
运行编译后的程序将正确解析以下所有内容:
但失败:
另一方面,如果我创建一个HIGH
具有高优先级的虚拟令牌:
然后穿上%prec HIGH
规则 9:
在这种情况下(1+2)
会解析但(1+)
不会。
我了解移位/减少冲突的一般背景。我只是不知道如何协商它来解决这个解析挑战。
parsing - 在 Lemon 中使用 midaction 规则来解释“let”表达式
我正在尝试使用 Flex + Lemon 编写一个“玩具”解释器,它支持非常基本的“let”语法,其中变量 X 临时绑定到表达式。例如,“letx 3 + 4 in x + 8”应计算为 15。
本质上,我“喜欢”的规则是:
但这不起作用,因为在分配O
之前进行了评估。X = N
我知道通常的解决方案是中间规则行动。Lemon 没有明确支持这一点,但我在其他地方读到过无论如何都只是语法糖。
因此,我尝试制定一个中期规则行动,X = N
在解释之前完成我的任务O
:
但这不起作用,因为midruleaction
规则无法访问N
,或者至少我在柠檬文档/示例中看不到。
我想我在这里遗漏了一些东西。我知道我可以建造一棵树,然后再走一遍。我可能最终会这样做,但我想先了解如何更直接地解决这个问题。
有什么建议么?
compiler-construction - Bison - 一元运算符何时真正需要 %prec?
我目前是第一次玩 Flex 和 Bison。我已经阅读了Bison 手册页上的上下文优先级。试图在不使用%prec
指令的情况下构建一个最小的示例,因为我不太熟悉它的实际作用。这是我的最小示例。
弹性文件
野牛文件
主 cpp 文件
我没有做过深度测试,但是对于我能想到的每一个使用一元减号的组合,我得到了正确的结果。我只是那么幸运,还是%prec
只在某些特殊情况下才需要该指令?当需要指令时,我也会欣赏示例,这样我就可以自己评估堆栈上的移位和减少。
谢谢