首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有人能解释为什么这个语法不能被LL(1)解析器解析吗?

这个语法不能被LL(1)解析器解析的原因有多种可能性。以下是一些可能的原因:

  1. 左递归:LL(1)解析器不能处理直接左递归的产生式。左递归指的是产生式右侧的非终结符以自身开头。如果语法中存在左递归,LL(1)解析器将无法选择正确的产生式,导致解析失败。
  2. 公共前缀:LL(1)解析器要求产生式的右部首符号是唯一的,以便做出正确的选择。如果存在多个产生式具有相同的首符号,LL(1)解析器将无法确定选择哪个产生式,导致解析失败。
  3. 二义性:如果语法存在二义性,即存在多个解析树可以解释同一个输入串,LL(1)解析器将无法确定选择哪个解析树,导致解析失败。
  4. First/Follow集冲突:LL(1)解析器使用First集和Follow集来进行预测分析,如果存在First集和Follow集的冲突,LL(1)解析器将无法正确预测产生式的选择,导致解析失败。

综上所述,以上是一些可能导致语法不能被LL(1)解析器解析的原因。针对具体的语法,需要进一步分析和调试才能确定具体的原因。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

自制计算器——《自制编程语言》二

3.少许理论知识-LL(1)与LALR(1)     上面的语法解析器会对记号进行预读,并按照语法图的流程读入所有记号。这种类型的解析器叫作LL(1)解析器。...LL(1)解析器能解析语法叫作LL(1)语法。 Pascal语法采用的就是LL(1) LL(1)解析器语法上需要非终结符与解析器内部的函数一一对应。...因此LL(1)语法所做的解析器都比较简单,语法能表达的范围比较狭窄。    ...BNF这样的语法称为左递归,原封照搬左递归的语法规则是无法实现递归下降分析的。 yacc生成的解析器称为LALR(1)解析器,这种解析器能解析语法称为LALR(1)语法。...LL(1)、LALR(1)本篇实际制作的计算器采用LL(1)语法作为解析器的,因此比较简单,适合手写。如果采用LALR(1)等LR语法的话,则更适合用yacc等工具自动生成。

1.6K20

Python之父发文,将重构现有核心解析器

几年前,有人问 Python 是否会转换用 PEG 解析器(或者是 PEG 语法,我不记得确切内容、谁说的、什么时候说的)。我稍微看过这个主题,但没有头绪,就放弃了。...它使用了我自己写的 LL(1) 解析的变种——我不喜欢可以产生空字符串的语法规则,所以我禁用了它,进而稍微地简化了生成解析表的算法。...LL(1) 名字中的 “1” 表明它只使用单一的前向标记符(a single token lookahead),而这限制了我们编写漂亮的语法规则的能力。...三十年前,我有充分的理由来使用单一前向标记符的解析技术:内存很昂贵。LL(1) 解析(以及其它技术像 LALR(1),因 YACC 而著名)使用状态机和堆栈(一种“下推自动机”)来有效地构造解析树。...过去有人曾说,pgen 的 LL(1) 缺陷帮助了 Python 保持语法的简单。

1K10
  • Python 之父新发文,将替换现有解析器

    几年前,有人问 Python 是否会转换用 PEG 解析器(或者是 PEG 语法,我不记得确切内容、谁说的、什么时候说的)。我稍微看过这个主题,但没有头绪,就放弃了。...它使用了我自己写的 LL(1) 解析的变种——我不喜欢可以产生空字符串的语法规则,所以我禁用了它,进而稍微地简化了生成解析表的算法。...LL(1) 名字中的 “1” 表明它只使用单一的前向标记符(a single token lookahead),而这限制了我们编写漂亮的语法规则的能力。...三十年前,我有充分的理由来使用单一前向标记符的解析技术:内存很昂贵。LL(1) 解析(以及其它技术像 LALR(1),因 YACC 而著名)使用状态机和堆栈(一种“下推自动机”)来有效地构造解析树。...过去有人曾说,pgen 的 LL(1) 缺陷帮助了 Python 保持语法的简单。

    1.1K30

    教你一招:用70 行 Python 代码编写一个递归下降解析器

    现在我们有了一个标记列表,下一步就是将它解析为一个AST。 第二步:语法定义 我选择的解析器实现自一个本地垂直解析器,其来源于LL解析器的一个简单版本。...(如果您还不理解上述语法,请阅读我之前发表的文章) 现在我使用LL解析器,以如下方式定义计算器的语法: ? 大家可以看到,这里有一个微妙的变化。有关”addandmul”的递归定义反转了。...甚至连聪明的LL解析器例如ANTLR也逃避不了这个问题,它会以友好的错误提示代替无穷的递归,而不像我们这个玩具解析器那样。 左递归可以很容易的转变为右递归,我就这么做的。...但是解析器并不是那么简单,它又会产生另一个问题:当左递归正确的解析3-2-1为(3-2)-1,而右递归却错误的解析为3-(2-1)。...一些LL解析器选择修正树里面的关联性。这样需要编写多行代码;)。这个不采纳,我们需要使它扁平化。

    1.2K100

    如果没有这个设计模式,目前所有的编程语言都将不复存在!

    解释器模式的定义是,给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。 嗯~ o( ̄▽ ̄)o~貌似看不懂这个定义哈哈 举个例子:大家知道SQL语句?...要理解这个语言,MySQL数据库中需要有一个解析器来解释这种语言表达的句子(SQL语句)。 照理说,Oracle数据中也有解析器来解释SQL语句呀!...是的呐~ 但是Oracle中的解析器能解释的语言中没有"limit"这样的表达。...ps:我之所以在例子中用“解析器这个词来代替“解释器”,是因为数据库处理SQL语句设计到词法分析、语句优化、执行等等。并且,仅用“解析器”来概括整个数据库对SQL语句的处理过程也是不全面的。...首先,恕小二哥这里不能实现上面数据库解释SQL这样一个例子!(小二哥实在是整不出一个数据库出来) 现在,小二哥以参观车展为例,模拟一个解释器模式。 我们要解析的语言结构是:xxx看车展。

    13840

    Python 之父撰文回忆:为什么要创造 pgen 解析器

    花下猫语:近日,Python 之父在 Medium 上开通了博客,并发布了一篇关于 PEG 解析器的文章(参见我翻的 全文译文)。据我所知,他有自己的博客,为什么还会跑去 Medium 上写文呢?...我也熟悉 LL(1) 解析器,并已认真地编写过一些递归下降的 LL(1) 解析器——我很喜欢它,而且还熟悉 LL(1) 解析器的生成技术(同样是因为龙书),所以我有了一个改进念头想要试验下:使用正则表达式...【更新:请参阅下文,对于这个理由,有个略微不同的版本。】 我曾不熟悉更高级的技术,或者曾认为它们效率太低。(在当时,我觉得工作在解析器上的大多数人都是这样。)...(因为输入格式跟原始的 pgen 相同,用它来生成一个 Python 解析器很容易——我只需将语法文件喂给工具。:-) ?...(这已经证明是一把双刃剑,后来我们添加了一个由单独的生成器所驱动的“解析树 -> AST”步骤,以简化字节码生成器。)

    1.4K30

    Python 3.9 也要来了?

    开发者不容易察觉到新的语法解析器带来的变化,但是它有可能成为 Python 演变中的一个重要转变。...Python 目前主要使用一种基于 LL (1)的语法,而这种语法可以通过 LL (1)解析器进行解析——该解析器从上到下、从左到右地解析代码,只需要从词法分析器中取出一个 token 就可以正确地解析下去...我并不是非常清楚它的工作原理,但是我可以给出LL(1) 存在的一些问题: Python 中包含非 LL(1) 语法,正因如此,当前语法采用了一些曲线救国的办法,带来了很多不必要的复杂性。...LL(1) 给 Python 语法造成了很多限制。某个相关话题 提到了下面代码无法用当前的解析器进行解析(会造成 SyntaxError)。...with (open("a_really_long_foo") as foo, open("a_really_long_bar") as bar): pass LL(1) 不能处理左递归

    45510

    Python 3.9 也要来了?

    开发者不容易察觉到新的语法解析器带来的变化,但是它有可能成为 Python 演变中的一个重要转变。...Python 目前主要使用一种基于 LL (1)的语法,而这种语法可以通过 LL (1)解析器进行解析——该解析器从上到下、从左到右地解析代码,只需要从词法分析器中取出一个 token 就可以正确地解析下去...我并不是非常清楚它的工作原理,但是我可以给出LL(1) 存在的一些问题: Python 中包含非 LL(1) 语法,正因如此,当前语法采用了一些曲线救国的办法,带来了很多不必要的复杂性。...LL(1) 给 Python 语法造成了很多限制。某个相关话题 提到了下面代码无法用当前的解析器进行解析(会造成 SyntaxError)。...with (open("a_really_long_foo") as foo, open("a_really_long_bar") as bar): pass LL(1) 不能处理左递归

    53520

    Python3.9正式版即将发布,来看看新特性

    开发者不容易察觉到新的语法解析器带来的变化,但是它有可能成为 Python 演变中的一个重要转变。...Python 目前主要使用一种基于 LL (1)的语法,而这种语法可以通过 LL (1)解析器进行解析——该解析器从上到下、从左到右地解析代码,只需要从词法分析器中取出一个 token 就可以正确地解析下去...我并不是非常清楚它的工作原理,但是我可以给出LL(1) 存在的一些问题: Python 中包含非 LL(1) 语法,正因如此,当前语法采用了一些曲线救国的办法,带来了很多不必要的复杂性。...LL(1) 给 Python 语法造成了很多限制。某个相关话题 提到了下面代码无法用当前的解析器进行解析(会造成 SyntaxError)。...with (open("a_really_long_foo") as foo, open("a_really_long_bar") as bar): pass LL(1) 不能处理左递归

    69210

    Python3.9 正式版即将发布,看看新特性

    开发者不容易察觉到新的语法解析器带来的变化,但是它有可能成为 Python 演变中的一个重要转变。...Python 目前主要使用一种基于 LL (1)的语法,而这种语法可以通过 LL (1)解析器进行解析——该解析器从上到下、从左到右地解析代码,只需要从词法分析器中取出一个 token 就可以正确地解析下去...我并不是非常清楚它的工作原理,但是我可以给出LL(1) 存在的一些问题: Python 中包含非 LL(1) 语法,正因如此,当前语法采用了一些曲线救国的办法,带来了很多不必要的复杂性。...LL(1) 给 Python 语法造成了很多限制。某个相关话题 提到了下面代码无法用当前的解析器进行解析(会造成 SyntaxError)。...with (open("a_really_long_foo") as foo, open("a_really_long_bar") as bar): pass LL(1) 不能处理左递归

    45430

    理解递归下降分析和parsec应用

    1. 前言 本文将会从上下文无关文法开始介绍,从使用 BNF 描述语法到理解递归下降分析思想,最后实现一个简单的 html 解析器收尾。...在含有递归的语法中,不能出现左递归(包括间接左递归),也不能有二义性,没有左递归且没有二义性的语法符合 LL(1)文法,就可以使用递归下降分析法解析。...递归下降分析 符合 LL(1)文法的语法可以使用递归下降分析法解析。...ELEMENT 这个解析器有点复杂,还可以进一步拆分, 例如将 props 部分拆出来作为一个 props 解析器: function PROPS() { let key let value...应用价值: 在编写 BNF 的时候,可以更好的理解编程语言语法设计理念。有助于写出能够编译器优化的语法

    1.7K00

    【云+社区年度征文】面试官问我Chrome浏览器的渲染原理(6000字长文)

    前言 对于HTML,css和JavaScript是如何变成页面的,这个问题你了解过?浏览器究竟在背后都做了些什么事情呢?...so,解析器一般解析工作分两个组件处理,为词法分析器(负责将输入内容分解成一个个有效标记),解析器负责根据语言的语法规则来分析文档的结构,来构建解析树。...自上而下就是: 解析器语法的高层结构出发,尝试从中找到匹配的结构。...你知道一种工具叫解析器生成器,它能够帮助你生成解析器,你只要向它提供你所使用的语言的语法,即词汇和语法规则,然后就会生成相应的解析器。 你晕了吗?...面试一问:为什么要构建DOM树? 答:因为浏览器不能直接理解和使用HTML,so,需要将HTML转换为浏览器能够理解的结构,即是DOM树(树结构一般都了解了的)。

    1.4K211

    面试官问我Chrome浏览器的渲染原理(6000字长文)

    前言 对于HTML,css和JavaScript是如何变成页面的,这个问题你了解过?浏览器究竟在背后都做了些什么事情呢?...so,解析器一般解析工作分两个组件处理,为词法分析器(负责将输入内容分解成一个个有效标记),解析器负责根据语言的语法规则来分析文档的结构,来构建解析树。...你知道一种工具叫解析器生成器,它能够帮助你生成解析器,你只要向它提供你所使用的语言的语法,即词汇和语法规则,然后就会生成相应的解析器。 你晕了吗?...面试一问:为什么要构建DOM树? 答:因为浏览器不能直接理解和使用HTML,so,需要将HTML转换为浏览器能够理解的结构,即是DOM树(树结构一般都了解了的)。...本篇文章的最后,留下一些面试题:为什么减少重绘、重排能优化Web性能?如何能减少重绘、重排呢?

    2K30

    Python 3.9 beta2 版本发布了,看看这 7 个新的 PEP 都是什么?

    基本上很少有人喜欢“cut”,因此“strip”、“strim”和“remove”提出来了,并且都获得了一些支持。...2、新解析器 并不令人感到惊讶的是,指导委员会已经接受了我们在 4 月中旬介绍过的 CPython 新解析器。...它已经运行良好,并且在现有解析器的速度和内存使用方面提升了 10% 以内的性能。由于解析器是基于解析表达语法(PEG),因此也将简化语言规范。...CPython 现有的 LL(1) 解析器存在诸多缺点和一些 hack,新的解析器将会消除掉。 这一更改为 Python 超越 LL(1) 语法铺平了道路,尽管现有语言并不完全是 LL(1)。...如果做了那些更改,那么,其它的 Python 实现(例如 PyPy 和 MicroPython)就需要切换解析器LL(1) 实现,以便跟上语言规范的要求。这可能会使核心开发者暂停进行此类更改。

    51620

    XML是历史前进中的怪胎

    互联网本身不是理性事先设计出来的,但是我们总是想在互联网上再次理性设计,XML和区块链都是人类理性自负地结果,有人甚至将区块链和互联网相比,他们不知道互联网可不是哪个上帝式的人或公司设计出来的,现在谷歌公司试图干扰互联网的各种小动作其实是一种作恶...解析器每十年写的次数屈指可数,因此,可写性打败了可解析性。...你可以获取XML解析器,编写DTD,并自动生成几乎所有内容的代码,使用XSL,可将自动解析的XML文件自动生成输出文件。如果有需要,你甚至可以通过XML输出更多的XML,并且可以永远的持续下去。...所有的这一切以为这,如果你采用XML,你永远不需要编写另一个解析器或另一个输出生成器。你也不需要学习任何的新语法(讽刺的是,XSL和DTD是你仍然要了解的“新”语法),因为所有的语法,都是XML!...对? JSON的出现为网络App清除了XML,但是我们为什么使用XMLHttpRequest来获取JSON?

    50100
    领券