ll相关内容

Epsilon(ε)乘积与LR(0)文法和LL(1)文法

在很多地方(例如在这个答案中here),我已经看到,LR(0)文法不能包含ε乘积。 我也在Wikipedia中看到过这样的语句:无ε的LL(1)文法也是SLR(1)。 现在我面临的问题是,我无法推理出这些陈述背后的逻辑。 我知道LR(0)文法通过空栈接受DPDA接受的语言,即它们接受的语言必须具有前缀属性。[然而,如果我们假定结束标记,则可以处理该前缀属性,并且在给定任何语言的情况下 ..
发布时间:2022-05-14 13:48:24 其他开发

Ll-1解析器:Follow-set真的有必要吗?

据我所知,如果输入流中有错误,跟随集会在第一个可能的时刻告诉我。对吗? 因为不然的话,我想知道你到底需要它做什么。考虑到您的解析器在堆栈的顶部有一个非终结点(在我们的类中,我们使用了一个堆栈作为LL解析器的抽象) 即 [TOP] X...[BOTTOM] 下一步将替换X,因为它位于堆栈的顶部。因此,解析器询问解析表对X使用什么派生。 + b 其中+和b都是终端。 ..

LL和LR解析有什么区别?

谁能给我一个 LL 解析与 LR 解析的简单示例? 解决方案 在高层次上,LL 解析和 LR 解析的区别在于 LL 解析器从开始符号开始,并尝试应用产生式到达目标字符串,而 LR 解析器从目标字符串开始并尝试返回开始符号. LL 解析是从左到右、最左边的推导.也就是说,我们从左到右考虑输入符号并尝试构造最左推导.这是通过从开始符号开始并重复扩展最左边的非终结符来完成的,直到我们到达目 ..
发布时间:2022-01-17 08:28:23 其他开发

如何手动构建 AST?

我目前正在学习解析,但我对如何生成 AST 有点困惑.我编写了一个解析器,可以正确验证表达式是否符合语法(当表达式符合时它是静默的,如果不符合则引发异常).我从哪里开始构建 AST?我找到了大量有关构建 LL(1) 解析器的信息,但关于构建 AST 的信息却很少. 我当前的代码(用非常简单的 Ruby 编写,包括词法分析器和解析器)可在 github 上找到:https://gist.git ..
发布时间:2021-11-26 17:59:19 其他开发

带有 ANTLR 或 ANTLR3 的 LL(1) 表驱动编译器

是否可以使用 ANTLR 或 ANTLR3 创建一个 LL(1) 表驱动(非递归)编译器? 解决方案 没有 然而,由于 ANTLR 是开源的,你可以修改 ANTLR 的一个分支来做到这一点. ANTLR 将词法分析器和解析器构建为递归下降源代码.这就是 ANTLR 易于使用和流行的原因,因为人们可以查看源代码并了解词法分析器和解析器与查看表条目相比如何工作.因为是源代码,所以也 ..
发布时间:2021-11-11 03:53:25 其他开发

可以修改 ANTLR 语法文件以供 PLY 使用吗?

我想制作一个使用 PLY 解析 Javascript 文件的 python 程序,我没有找到任何实现 ECMAScript、使用 PLY 的 Javascript 规则的解析器的来源. 我唯一发现的是一些用于解析 javascript 和 ecmascript 的 ANTLR 语法文件:http://www.antlr.org/grammar/1153976512034/ecmascript ..
发布时间:2021-11-11 03:46:04 Python

Antlr左递归问题

我的 Antlr 语法中有一个左递归问题.虽然我想我明白为什么会出现问题,但我想不出解决办法.问题出在我的数据类型规则的最后一行.我已经包含了整个语法供您查看: 语法测试;选项 {output=AST;ASTLabelType=CommonTree;}令牌{功能;属性;孩子们;合成的;}程序:功能;功能:ID(OPEN_BRACKET(属性(逗号?属性)*)?CLOSE_BRACKET)?(OP ..
发布时间:2021-11-11 03:37:31 其他开发

使用堆栈实现的LL(1)解析器:如何构建AST?

我目前正在手动构建一个解析器.它是LL(1)解析器.目前,它是一个很好的识别器:它的函数parse(List tokens)决定令牌是否是该语言的成员. 现在,我想为该输入构建相应的AST.但是,我知道如何以递归的方式实现它(已经做到了).也就是说,对于挑战,我使用具有经典算法的堆栈来实现我的堆栈: next ..
发布时间:2021-04-24 19:37:41 其他开发

编译-LL1语法

我正在研究编译器的魔力,但我不明白结果. 这是语法: S->一种 #A->B G D EB->+ |-|爱普生C->c C |爱普生G->碳D->.C |爱普生E->e B G |爱普生 当我尝试查找“第一"和“跟随"集时,得到的结果与使用在线预测变量得到的结果不同. 以下是给出的结果: 非终端符号/跟随集新币$一种 #cC e,.,#G ..
发布时间:2021-04-23 19:59:46 其他开发

可以将ANTLR语法文件修改为供PLY使用吗?

我想制作一个使用PLY解析Javascript文件的python程序,但找不到任何实现ECMAScript的解析器源,即使用PLY的Javascript规则. 我发现的唯一东西是一些ANTLR语法文件,用于解析javascript和ecmascript: http://www.antlr.org/grammar/1153976512034/ecmascriptA3.g http://www. ..
发布时间:2020-06-29 20:56:29 Python

使用PyParsing解析函数调用

我正在尝试解析一种简单的语言.问题来自于解析函数调用.我试图告诉它,函数调用是一个表达式,后跟左括号,参数列表和右括号.我有这样的东西: expr = Forward() iden = Word(alphas+'_', alphanums+'_') integer = Word(nums) binop = operatorPrecedence(expr, ...) # irrevelant ..
发布时间:2020-06-29 20:56:25 Python

LR(0),LL(0),LALR(1)等之间的关系?

我真的很难理解之间的关系: LR(0) LL(0) LALR(1) SLR(1) LR(1) LL(1) 我很确定LALR(1)和SLR(1)是LR(1)的子集,但是我对其他的内容一无所知.他们都是独家的吗? LL(0)是LL(1)的子集吗? 谢谢 解决方案 包含规则如下: 每个LR(0)语法也都是SLR(1),但并非所有SLR(1)语法都是LR(0). ..
发布时间:2020-06-29 20:56:22 其他开发

LL(1)解析器中FIRST和FOLLOW集的目的?

有人可以向我解释LL(1)语法中应如何使用FIRST和FOLLOW吗?我知道它们用于语法表构建,但是我不知道如何. 解决方案 在LL(1)解析器中,解析器的工作原理是维护一个工作区,该工作区最初是种子到开始符号的,后面是字符串结束标记(通常表示为$).在每个步骤中,它都会执行以下操作之一: 如果工作区的第一个符号是终端,则将其与下一个输入标记进行匹配(如果不匹配,则报告错误). 如 ..
发布时间:2020-06-29 20:56:19 其他开发

Antlr左递归问题

我在Antlr语法中有一个左递归问题.虽然我认为我理解为什么存在问题,但我无法想到解决方案.问题出在我的数据类型规则的最后一行.我已经包括了整个语法供您查看: grammar Test; options {output=AST;ASTLabelType=CommonTree;} tokens {FUNCTION; ATTRIBUTES; CHILDREN; COMPOSITE;} pro ..
发布时间:2020-06-29 20:56:16 其他开发

为什么LL语法不能是左递归的?

在 龙书 中,LL语法定义为如下: 当且仅当对于任何产生式A -> a|b,以下两个条件适用时,语法为LL. FIRST(a)和FIRST(b)是不相交的.这意味着它们不能同时导出EMPTY 如果b可以派生EMPTY,则a不能派生任何以FOLLOW(A)开头的字符串,即FIRST(a)和FOLLOW(A)必须不相交. 我知道LL语法不能递归,但是正式原因是什么?我猜左递归语 ..
发布时间:2020-06-29 20:56:14 其他开发

Ebnf –这是LL(1)语法吗?

我在维基百科上找到以下 EBNF ,描述了EBNF: letter = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z ..
发布时间:2020-05-25 01:27:58 其他开发

是否找到不是LL(1)的语言?

最近我一直在处理很多不是LL(1)的语法,其中许多可以转换为LL(1)的语法. 但是,我从未见过不含糊的语言的示例,该示例不是LL(1).换句话说,一种语言的语法没有任何歧义,不是LL(1)),我也不知道如何证明我偶然发现了一种语言. 有人知道如何证明一种特定的语言不是LL(1)吗? 解决方案 我想了好一会儿,然后在维基百科: S -> A | B A -> 'a' A ..
发布时间:2020-05-25 01:25:10 其他开发

制作语法LL(1)

我有以下语法: S→a S b S | b S a S | ε 由于我正在尝试为其编写一个小型编译器,所以我希望使其成为LL(1).我看到这里似乎有一个FIRST/FOLLOW冲突,而且我知道我必须使用替代来解决它,但是我不确定该如何解决.这是我建议的语法,但是我不确定它是否正确: S-> aSbT | epsilon T-> bFaF | epsilon F-> e ..

用于上下文无关文法的FIRST和FOLLOW集的计算算法

我需要一种算法来为语法计算FIRST和FOLLOW集. 是否有用于计算这些的简单算法或简单代码? 解决方案 大多数编译器教科书和有关解析算法的书中都讨论了用于计算FIRST和FOLLOW集的标准算法.如果您上的课程涵盖了这一主题,并且没有指定的阅读材料或与此主题相关的材料,我会感到惊讶. 我教了一个有关编译器构造的课程,并提供了一些讲座幻灯片,在这里可能会有用.您可能想查看幻灯片3 ..
发布时间:2020-05-25 01:07:18 其他开发

如何手动构造AST?

我目前正在学习解析,但是对于如何生成AST感到有些困惑.我编写了一个解析器,可以正确地验证表达式是否符合语法(当表达式符合时它是静默的,而当表达式不符合时它会引发异常).我要从哪里去建立AST?我发现了很多有关构建LL(1)解析器的信息,但随后构建AST的信息很少. 我的当前代码(使用非常简单的Ruby编写,包括一个词法分析器和解析器)可以在github上找到: https://gist.g ..
发布时间:2020-05-25 01:06:25 其他开发