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

将BNF转换为EBNF混淆了左右递归的区别

BNF(巴科斯范式)和EBNF(扩展巴科斯范式)都是用于描述语法规则的形式化表示方法。它们的主要区别在于对于递归的处理方式。

  1. BNF(巴科斯范式):
    • 概念:BNF是一种用于描述上下文无关文法的形式化表示方法,它由一组产生式规则组成,每个产生式规则由非终结符、终结符和特殊符号组成。
    • 分类:BNF可以分为终结符和非终结符,终结符表示语法中的基本元素,而非终结符表示由终结符组成的复杂结构。
    • 优势:BNF简洁明了,易于理解和使用,可以描述大部分的上下文无关文法。
    • 应用场景:BNF常用于编程语言的语法描述、编译器设计和语法分析器生成等领域。
    • 推荐的腾讯云相关产品和产品介绍链接地址:暂无推荐的腾讯云相关产品。
  • EBNF(扩展巴科斯范式):
    • 概念:EBNF是在BNF的基础上进行扩展的一种形式化表示方法,它引入了一些额外的语法元素,如可选项、重复项和分组等,以更加灵活地描述语法规则。
    • 分类:EBNF与BNF类似,也包含终结符和非终结符,但在规则的定义上更加灵活。
    • 优势:EBNF相对于BNF更加简洁和易读,可以更直观地描述复杂的语法规则。
    • 应用场景:EBNF常用于语法分析器生成、语言设计和文档编写等领域。
    • 推荐的腾讯云相关产品和产品介绍链接地址:暂无推荐的腾讯云相关产品。

总结:BNF和EBNF都是用于描述语法规则的形式化表示方法,BNF相对简单,适用于大部分上下文无关文法的描述;EBNF在BNF的基础上进行扩展,引入了一些额外的语法元素,更加灵活和易读。它们在云计算领域中并没有直接的应用,而是主要用于编程语言的语法描述和编译器设计等领域。

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

相关·内容

用c语言手搓一个500+行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1

基本概念 就像之前所说的那样,语法分析指将词法分析得到的标记流(token)进行分析,组成事先定义好的有意义的语句。那么如何完成这样一个工作呢?我们可以借助一个叫“BNF”的数学工具。...EBNF EBNF是基本巴科斯范式(BNF)元语法符号表示法的一种扩展,主要对BNF中常见的两种情况,即重复项和可选项添加了相应的语法规则,如用方括号" .... " 表示可选部分,用花括号"{ ......: if-stmt -> if ( exp ) statement; [ else statement; ] 递归下降文法 递归下降分析法也很简单,就是用函数的调用来模拟BNF的替换过程,我们只需要为每个非终结符定义一个分解函数...实际上,EBNF文法就是为了映射递归下降分析法的具体程序实现而设计的,因此我们这里就用EBNF文法来实现递归下降分析。...来看看怎样用递归下降文法计算tryC中的表达式 上面说了一大堆,现在看看实际的计算表达式的实现是怎样的呢 算术表达式 tryC中需要计算四则运算表达式的EBNF文法如下: exp -> term { addop

1.8K00

用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1:EBNF和递归下降文法

用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言...这一章开始进入解释器的核心部分: 语法分析器; 我们来看看两个概念,EBNF和递归下降文法,以及如何用这两个方法来计算tryC中的表达式。...基本概念 就像之前所说的那样,语法分析指将词法分析得到的标记流(token)进行分析,组成事先定义好的有意义的语句。那么如何完成这样一个工作呢?我们可以借助一个叫“BNF”的数学工具。...EBNF EBNF是基本巴科斯范式(BNF)元语法符号表示法的一种扩展,主要对BNF中常见的两种情况,即重复项和可选项添加了相应的语法规则,如用方括号"[ … ]" 表示可选部分,用花括号"{ … }...实际上,EBNF文法就是为了映射递归下降分析法的具体程序实现而设计的,因此我们这里就用EBNF文法来实现递归下降分析。

53220
  • 上下文无关文法产生的语言都可以用正则文法来描述_c语言结构体默认值

    大家好,又见面了,我是你们的朋友全栈君。...BNF的扩展EBNF: 可选项被括在元符号“[”和“]”中 重复项(零个或者多个)被括在元符号“{”和“}”中 仅一个字符的终结符用引号(“)引起来,以和元符号区别开来 上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述...BNF的扩展EBNF: 可选项被括在元符号“[”和“]”中 重复项(零个或者多个)被括在元符号“{”和“}”中 仅一个字符的终结符用引号(“)引起来,以和元符号区别开来 上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述...首先,用作识别这些结构的算法必须使用递归调用或显式管理的分析栈。其次,用作表示语言语义结构的数据结构现在也必须是递归的(通常是一颗分析树),而不再是线性的(如同用于词法和记号中的一样)了。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    1.1K20

    懂前端的你也可以轻松定义自己业务的DSL

    语法定义通常使用BNF或EBNF表示。2.实现DSL的解析器:DSL解析器是将DSL代码解析为计算机可执行的指令的程序。解析器通常使用词法分析器和语法分析器来实现。...OK,立即这些,就看看其中的一些概念,对于新手可能需要科普一下:BNF或EBNF简单的描述BNF(巴克斯-诺尔范式)和 EBNF(扩展巴克斯-诺尔范式)是一种用于描述编程语言结构的形式语法。...EBNF是BNF的一个扩展,添加了更多的元素来描述更复杂的语言结构。...{}] ["e" [] {}]这个EBNF描述了一个JSON对象由大括号包围着若干个属性(property)组成。...起始符号:E这个文法可以生成类似于“3+4*5”的算术表达式。左递归和空规则左递归:在一个产生式的右部出现了该产生式本身作为左部的情况,例如:A->Aα(α为任意串)。

    2.5K41

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

    这是一个简短的脑转储(也许我今后会解释它)。 (译注:我大胆揣测一下“脑转储”吧,应该说的是,把个人的记忆以及 Python 的历史细节,转化成文字,这是个存储固化的过程,方便传承。...我也熟悉 LL(1) 解析器,并已认真地编写过一些递归下降的 LL(1) 解析器——我很喜欢它,而且还熟悉 LL(1) 解析器的生成技术(同样是因为龙书),所以我有了一个改进念头想要试验下:使用正则表达式...(某种程度的)而不是标准的 BNF 格式。...当然了,所谓“正则表达式”,我想说的其实是 EBNF ——我不确定 “EBNF” 在当时是否是一个被明确定义了的符号,它可能就指对 BNF 的任意扩展。...假如将 EBNF 转换为 BNF,再去使用它,将会导致尴尬的多解析树节点问题,所以我不认为这会是一种改进。

    1.4K30

    Policy Engine 的前世今生

    Rule parser:曾经沧海难为水 权衡各种利弊之后,我们最终选择了用 BNF 表述规则。...用 jison 描述 BNF(严格说,是 EBNF)很容易,定义好 lex 后,就可以定义 grammar 了。关于这个主题,我之前写过文章,见:如何愉快地写个小parser。在这里就不详述了。...jison 会把 EBNF 编译成 javascript 文件,然后我们包装一个简单的接口(主要考虑易用性),就可以让系统的其他部分调用了。它的效率很高,很好地支撑起了我们的服务。...ABNF 的语法比较别扭,tokenization 还需要显式地声明空白字符,不像 EBNF 直接写一句所有空白字符都 skip 就可以不必关心了。...当然,这不是什么大问题,更大的问题是 ABNF 不支持递归。突然间让我把一个由递归写就的 EBNF 转换成 ABNF,我很不适应,边翻 RFC5234 学习边写。

    1.5K140

    手写一个解析器

    运算有左右括号匹配来改变运算优先级,例如 =(C1+C2)*C3 这个时候光使用正则表达式就比较棘手了。...用 BNF 来表示你的 DSL 语法 BNF 的全称是 Backus–Naur form,是一种表示上下文无关语法的表示方式,Nearley 的语法基于 BNF 的扩展 EBNF(Extended Backus–Naur...form),下面是笔者写的关于这个 Excel 中的表达式的 Nearley 语法文件(为了便于理解,这里只实现了运算符的优先级,没有实现左右括号): grammar.ne @builtin "number.ne...它的运行结果将会作为整条产生式的运行结果。 至此如何书写 BNF 就介绍完了,你可以已经发现了,正则表达式也可以用 BNF 来表示,事实上正则也是上下文无关的问题,自然也就可以用 BNF 来表示。...Expression: 将 Expression 节点的左右运算参与者根据运算符进行运算,例如某个 Expression 的运算符是 *,则将 Expression 的左边和右边乘起来。

    1.2K41

    实现JavaScript语言解释器(二)

    上面我们使用了最直白的中文表达了Simple语言的一小部分语法规则,在实际工程里面我们肯定不能这么干,我们一般会使用巴克斯范式(BNF)或者扩展巴克斯范式(EBNF)来定义编程语言的语法规则。...BNF 我们先来看一个变量定义的巴科斯范式例子: 在上面的巴科斯范式中,每条规则都是由左右两部分组成的。在规则的左边是一个非终结符,而右边是终结符和非终结符的组合。...或者EBNF的内容,可以自行查阅相关的资料。...如何实现语法解析 在我们编写完属于我们语言的BNF规则之后,可以使用Yacc或者Antlr等开源工具来将我们的BNF定义转化成词法解析和语法解析的客户端代码。...我们需要从要解决的领域特定问题出发,对于Simple语言它就是:将Simple语言的BNF语法规则使用TypeScipt表达出来。

    60810

    编译入门 - 从零实现中文计算器

    执行一个字符串的程序一般称为解释器,实现一个解释器一般需要 3 个步骤。 词法分析。读取字符串,将字符串转换为单词流。 语法分析。读取单词流,根据语法将单词流变成抽象语法树。 解释执行。...EBNF Extended BNF,扩展的巴科斯范式。由于 BNF 语法有点繁琐,所以就有了 EBNF,它也有很多变种。...中文计算器语法 中文计算器的语法可以用下面 EBNF 来表示。...其实写 parser 也非常的简单,我们只需要对着上面定义的 EBNF 语法写就行了。...上面 chineseToArabic 是将中文数字变成阿拉伯数字,这里就不介绍了,感兴趣的同学可以查看相关源码。 总结 这篇文章通过实现中文计算器的方式,来介绍解释器的基本概念。

    78510

    JavaScript 语言通识 — 重学 JavaScript

    (BNF) 产生式:在计算机中指 Tiger 编译器将源程序经过词法分析(Lexical Analysis)和语法分析(Syntax Analysis)后得到的一系列符合文法规则(Backus-Naur...Form,BNF)的语句 巴科斯诺尔范式:即巴科斯范式(英语:Backus Normal Form,缩写为 BNF)是一种用于表示上下文无关文法的语言,上下文无关文法描述了一类形式语言。...所以用 BNF 去描述这个远算的时候,首先我们会定义一个加法表达式,格式就是: 乘法表达式的列表 或 加法表达式 + 乘法表达式 或 加法表达式 - 乘法表达式 因为 BNF 是可以递归的,所以在定义表达式的时候...其他产生式 除了乔姆斯基谱系可以用 BNF 来定义,其实还有很多的不同的产生式的类型。比如说后来出现的 EBNF、ABNF,都是针对 BNF 的基础上做了语法上的扩张。...虽然所他们都有不一样的标准和写法,但是它们所表达的意思大致上都是一样的。所以我们需要理解产生式背后的思路和原理,那么我们是可以忽略表达式上的区别的。

    67831

    如何愉快地写个小parser

    况且2000年左右的时候还没有LLVM这种神器,也没有github这样的冥想盆去「偷」别人的思想,设计出来的蹩脚语言只能到语法分析这一步就停下来,没有任何实际用处。...语法分析做的是pattern matching的事情,和regular expression的pattern matching不同,它允许你定义一系列可递归的规则。...instaparse支持EBNF/ABNF语法,可以很轻松地在生成的语法树中隐藏不需要的节点(注意 的部分)。我们看生成的结果: ? beautiful!...在instaparse里,写一个parser变成了三个简单的步骤: 使用BNF定义语法 隐藏不需要的语法节点 transform生成的语法数 你也可以轻松visualize一棵树(节选了task部分):...还有,下次如果你觉得markdown的语法缺点什么,想加些更丰富的内容进去,你大概知道该怎么做,可以用什么工具去做了。 ---- 1. 注:不少同学还没搞清楚parser和compiler的区别…

    3.2K100

    笨办法学 Python · 续 练习 33:解析器

    我看到一棵树,类似于我们之前创建的BSTree或TSTree。你看到树了吗?我们从这个文件的最上方开始,学习如何将字符转换为树。...我们已经将一个字符列表转换为一个记号列表,但看看def hello(x,y):函数。这是一个函数,里面有代码块。这意味着某种形式的“包含”或“东西里面的东西”的结构。...解析器将简单地删除()括号记号,并为可能的Function类创建一个特殊的parameters列表。它会删除冒号,无用的空格,逗号,任何没有真正意义的记号,并将其转换为更易于处理的嵌套结构。...RDP 使用多个相互递归的函数调用,它实现了给定语法的树形结构。RDP 解析器的代码看起来像你正在处理的实际语法,只要遵循一些规则,它们就很容易编写。...BNF 描述了所需的记号,以及这些记号如何重复来形成语言的语法。BNF 还使用与正则表达式相同的符号,所以*,+和?有相似的含义。

    58520

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

    前言 本文将会从上下文无关文法开始介绍,从使用 BNF 描述语法到理解递归下降分析思想,最后实现一个简单的 html 解析器收尾。...在含有递归的语法中,不能出现左递归(包括间接左递归),也不能有二义性,没有左递归且没有二义性的语法符合 LL(1)文法,就可以使用递归下降分析法解析。...左递归无法使用递归下降分析的原因是会让程序死循环,具体可以参考编译原理龙书 2.4.5 Left Recursion 章节。 3. 递归下降分析 符合 LL(1)文法的语法可以使用递归下降分析法解析。...ast 节点树了。...最后 使用 BNF 描述语法,然后按照 BNF 编写 语法单元 parser,最后将 parser 组合起来成为完整的 parser,这就是 Parser Combinators。

    1.7K00

    从编译原理看一个解释器的实现

    解决方案有两种: while遍历字符串,将括号、运算符、数字等取出来,根据运算符左结合以及优先级计算 将表达式转化成二叉树形式,二叉树的父节点是运算符,左右子节点代表数字,通过递归遍历树,将左右节点的数字运算之后放入父节点...当一个运算分量,比如上述的5左右两侧都有运算符时,我们需要一些规则来决定哪个运算符被应用于该运算分量。我们说运算符“+”是左结合的,因为当一个运算分量左右两侧都有“+”号时,它属于其左边运算符。...求值时,从root节点遍历二叉树,如果节点有子节点,递归的方式遍历下去,直到是叶子节点为止,接着将左子树和右子树取得的值放入它们的根节点,最后root节点的值就是表达式最终的值。...开始实现解释器 有了准备之后,接下来就是实现解释器,它可以解释游戏中的『公式』。 1.)...小结 本文为大家介绍了怎样从编译原理的角度来实现一个解释器。在游戏领域,需要解释器来解释自定义的『公式』。这个『公式』的语法往往是和上下文无关的,又被称为BNF范式。

    2.2K100

    javacc功能一览

    匹配:将最左侧的猜测终端符号与输入的最左侧未使用符号匹配。 在LR解析器期间,解析器在两个动作之间连续选择。 Shift:将输入的下一个标记添加到缓冲区以供考虑。 减少:减少终端和非终端的集合。...javacc特征 •JavaCC生成自上而下的(递归下降[1])解析器,而不是类似YACC[2]的工具生成的自下而上的解析器。尽管不允许左递归[3],这允许使用更通用的语法。...•JavaCC的允许扩展的BNF[5]规格-诸如(A)*,(A)+等-中的词汇和语法规格。扩展的BNF在某种程度上减轻了对左递归的需求。...•词汇规范可以将标记定义为在整个词汇规范的全局级别或单个词汇规范的基础上都不区分大小写。•JavaCC带有JJTree,这是一个功能非常强大的树构建预处理器。...•JavaCC还包括JJDoc,该工具可将语法文件转换为文档文件(可选地以HTML格式)。•JavaCC提供了许多选项来定制其行为以及生成的解析器的行为。

    2K10

    基于解析器组合子的语法解析器(上)

    2.如何解析语法 2.1 解析语法的运作 语法解析的运作,是将输入的原始文本按照给定的语法规则,在一定的上下文环境中,通过扫描和匹配,将原始文本转换为具有特定语义的结构化数据。...char)))) 复制代码 之后,再定义一个可以将准备好的字符列表转换为 token 的解析器: ;将stash-ls中保存的已经匹配到的字符转换为token对象 (define %:token (...则认为匹配失败 [_(begin (pretty-printf "%:token ~a~n" cur) (k-fail cur))])) k-fail)))) 复制代码 有了可以将字符列表转换为...由于call的 EBNF 定义中,其右侧的产生式第一项便是Expr,属于左递归语法,对于这样的式子,普通的递归下降解析器无法简单的处理,因此需要将其转换为非左递归的描述,将递归的部分剥离出来,放在产生式的右侧...函数的连续调用,可以将其转换为以下方式来描述: 在之后的文章中,会通过引入 GLL 的思想来支持左递归文法及二义文法。

    2.7K50

    65.精读《手写 SQL 编译器 - 文法介绍》

    BNF 范式通过 Left ::= Right 表示产生式。...举个例子,比如 SELECT * FROM table 可以被表达为: S → SELECT * FROM table 当然这是最固定的语法,真实场景中,* 可能被替换为其他单词,而 table 不但可能有其他名字...一般用大写的 S 表示文法的开头,称为开始符号。 终结符与非终结符 下面为了方便书写,使用 BNF 范式表示文法。...但是当我们将文法粒度变细,将 CASE WHEN 与 WHERE 区块分别交由两块文法解决,将等号这个通用的表达式抽离出来,就可以不关心上下文了,这种方式称为 上下文无关文法。...消除左递归 消除左递归一般通过转化为右递归的方式,因为左递归完全不消耗 Token,而右递归可以通过消耗 Token 的方式跳出死循环。

    57120

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

    同时,我还发明了一套类似 EBNF 的语法符号(译注:Extended Backus-Naur Form,BNF 的扩展,是一种形式化符号,用于描述给定语言中的语法),至今仍非常喜欢。...这就揭示了 pgen 的一部分 EBNF 能力:你可以在括号内嵌套可选内容,并且可以在括号后放 * 来创建重复,所以这里的 expr 规则就意味着:它是一个术语(term),跟着零个或多个语句块,语句块内是加号跟术语...幸运的是,运行 CPython 的计算机比 30 年前有了更多的内存,将整个文件存在内存中确实已不再是一个负担。...这其实正是它最早的工作方式,但是大约在 15 年前,我们发现编译器因为解析树的结构而变得复杂了,所以我们引入了一个单独的 AST,还引入了一个将解析树翻译成 AST 的环节。...我还没进展到这个地步,但已经有了一个原型,可以将一个 Python 的子集编译成一个 AST,其速度与当前 CPython 的解析器大致相当。

    1.1K30
    领券