[译]BNF 表示法:深入了解 Python 的语法 原文:《BNF Notation: Dive Deeper Into Python's Grammar》 https://realpython.com.../python-bnf-notation/ 在阅读Python文档的时候,你可能已经遇到过BNF(Backus–Naur form)表示法: 文档中的BNF 下面我们将了解BNF表示法,并使用它来理解Python...Python的BNF变体 Python 使用 BNF 表示法的自定义变体来定义语言的语法。...space 仅对分隔令牌有意义 这些符号定义了 Python 的 BNF 变体。...BNF 的最佳实践 当您阅读文档中的 Python 的 BNF 规则时,您可以遵循一些最佳实践来提高您的理解。
Python BNF 一提到实现脚本解释器,估计很多人都会挠头,不知道从何入手。刚开始我也是这样,我把大学里的编译原理从床底下一堆打入冷宫的数量翻出来,一顿猛看。...但是仍然没有找到很大头绪,后来我就在python.org上一顿逛,也下载了python的源码分析,源码目录有python的BNF描述文件,因为我已经看过一遍编译原理了,BNF就看的很懂,从头到尾读了一遍了以后...BNF就是完整的解析python语法的流程说明啊!...语法的时候,就可以从顶向下按照这个BNF尝试解析,如果不满足这个BNF语法要求的就报错。...我为了生成跟这个BNF一致的代码结构,写了个python脚本解析这个BNF自动生成C++的解析函数。
高级语言编程更加容易、维护容易,具备可移植性(一份代码可以运行在多个平台上),典型代表 :Java、Python、C、C++、Ruby、C#等。...解释型语言通过解释器读入高级语言写的指令,然后解释执行,Ruby、Python、PHP都是解释型语言。编译型语言使用编译器把高级语言变成目标代码。下面举个例子来介绍解释型语言和编译型语言的区别。...首选我们需要定义BNF。通过BNF来判定源代码是否符合该规范。下面,以Java的Class的BNF为例。...然后,编译器读入class,同BNF进行比较,符合语法的。直到编译器读入extend,发现和BNF规定的不相符,提示错误。...如果源代码符合BNF规则,则继续进行词法分析、语法分析、语义分析等等,这里就不做过多介绍了,我会在后续文章中详细介绍的。
最常见的“语法的正则表达式”被称为 Backus–Naur Form(BNF),以创作者 John Backus 和 Peter Naur 命名。...BNF 描述了所需的记号,以及这些记号如何重复来形成语言的语法。BNF 还使用与正则表达式相同的符号,所以*,+和?有相似的含义。...对于这个练习,我将使用 https://tools.ietf.org/html/rfc5234 上面的 IETF 增强 BNF 语法,来规定上面的微型 Python 代码段的语法。...我使用 CAPITALS 的约定,在 BNF 中表示我会跳过的东西。 LPAREN 我假设我收到了一个def,但是现在我打算确保有一个(,所以我要匹配它。...params 在 BNF 中我将params定义为了新的“语法产生式”,或者“语法规则”。意思是在我的 Python 代码中,我需要一个新的函数。
thrift 使用ply做编译和解析器,ply是编译原理入门比较方便的源码,代码量少,且python文本就是代码,解析方便 ex把每个扫面出来的单词叫统统叫做token,token可以有很多类。...那么yacc做的事情就是这一部分(实际应该说是BNF来做的)。 yacc会帮我们生成一个yyparse函数,这个函数会不断调用上面的yylex函数来得到token的类型。...所以,他没办法实现C语言自己,但是可以实现java、python等。...他们在.y中定义,这些token既会被lex使用到,也会被.y文件中的BNF使用到。 写词汇分析代码。这部分代码在.l文件(就是lex的输入文件)中。这块的定义方式是:正则表达式-->对应操作。...写BNF。这些东西定义了语言的规约方式。
Form,BNF)的语句 巴科斯诺尔范式:即巴科斯范式(英语:Backus Normal Form,缩写为 BNF)是一种用于表示上下文无关文法的语言,上下文无关文法描述了一类形式语言。...所以用 BNF 去描述这个远算的时候,首先我们会定义一个加法表达式,格式就是: 乘法表达式的列表 或 加法表达式 + 乘法表达式 或 加法表达式 - 乘法表达式 因为 BNF 是可以递归的,所以在定义表达式的时候...其他产生式 除了乔姆斯基谱系可以用 BNF 来定义,其实还有很多的不同的产生式的类型。比如说后来出现的 EBNF、ABNF,都是针对 BNF 的基础上做了语法上的扩张。...现代语言的特例 C++ 中,* 可能表达乘号或者指针,具体是哪个,取决于星号前面的标识符是否被声明为类型 VB 中,< 可能是小于号,也可能是 XML 直接量的开始,取决于当前位置是否可以接受XML直接量; Python...形式语言 —— 用途 数据描述语言 —— 有些时候我们需要去存储一个纯粹的数据,本身是没有办法进行编程的 JSON, HTML, XAML, SQL, CSS 编程语言 C, C++, Java, C#, Python
streaming) Storm 流式计算 参考:https://suncle.me/2018/04/16/Hadoop-MapReduce-HDFS-Introduction/ MapReduce工作原理 以Python...为例 参考:https://suncle.me/2018/04/17/Writing-An-Hadoop-MapReduce-Program-In-Python/ ?...官方设计文档: https://cwiki.apache.org/confluence/display/Hive/Design ANTLR解析器:https://github.com/antlr/antlr4 BNF...范式:http://sighingnow.github.io/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/bnf.html Hadoop、MapReduce、HDFS介绍:
他参与研发了FORTRAN, ALGOL等语言,以及帮助创建了BNF范式,用于程序设计语言的语法。由于FORTRAN和BNF的贡献,他于1977年获得ACM图灵奖。...受逻辑学家埃米尔·波斯特(Emil Post)的启发,巴克斯写下了后来被称为BNF(巴克斯诺尔形式)的IAL的全部语法。这种形式主义使用形状元语言变量的规则来描述语言 :模式。...这个改进版的BNF随后被用于最终的ALGOL 60报告。图6显示了1960年会议上的一些ALGOL委员会成员。这份报告发表后,BNF变得更加广为人知。...由于他在普及BNF方面的努力,首字母缩略词最初被认为是指巴克斯范式,现在被称为巴克斯诺尔形式。 图6:1974年ACM编程语言历史的图片,显示了一些ALGOL委员会成员。...除了BNF,巴克斯在ALGOL开发过程中所做的贡献还不清楚。BNF仍然是ALGOL对计算机科学最重要的贡献之一。如今几乎所有编程语言的语法都是用这种形式描述的。
我们可以借助一个叫“BNF”的数学工具。...BNF与上下文无关文法 Backus-Naur符号(就是众所周知的BNF或Backus-Naur Form)是描述语言的形式化的数学方法,由John Backus (也许是Peter Naur)开发,最早用于描述...BNF类似一种数学游戏:从一个符号开始(叫做起始标志,实例中常用S表示),然后给出替换前面符号的规则。...BNF语法定义的语言是一个字符串集合,可以按照下述规则书写,这些规则叫做书写规范(产生式规则),例如一个四则运算表达式可以表示为: exp -> exp op exp | ( exp ) | number...EBNF EBNF是基本巴科斯范式(BNF)元语法符号表示法的一种扩展,主要对BNF中常见的两种情况,即重复项和可选项添加了相应的语法规则,如用方括号" .... " 表示可选部分,用花括号"{ ...
我亲眼看见一个同事在费力地用perl一行行解析某个系统的数据文件,却压根没想到写个BNF。BNF对他来说,不是一种选择。」 很多同学不解,问我:lex/yacc不是写编译器 [1] 的么?...bison使用的描述规则的语法是BNF的变体。 以下是编译和执行的结果,作为展示,我仅仅把语法树中我感兴趣的内容打印出来了: ?...嗯,你可以对着g4语法文件轻松生成python,javascript等的源码,然后集成到你自己的项目里。继续哭吧。 SAX-like event driven。...这种以前看上去无解的恶心需求,现在可能只需要一天就能搞定了: 假如代码是python3,找到python3的g4 file,用antlr4生成lexer/parser listen每个 def 规则,统计里面的有效代码数...BNF。
并已认真地编写过一些递归下降的 LL(1) 解析器——我很喜欢它,而且还熟悉 LL(1) 解析器的生成技术(同样是因为龙书),所以我有了一个改进念头想要试验下:使用正则表达式(某种程度的)而不是标准的 BNF...我决定设计一些稍微像 Python 的东西,用 Python 来实现,并且决定要重用 pgen,但是后端要基于 Python,使用 tokenize.py 作为词法分析器。...当然了,所谓“正则表达式”,我想说的其实是 EBNF ——我不确定 “EBNF” 在当时是否是一个被明确定义了的符号,它可能就指对 BNF 的任意扩展。...假如将 EBNF 转换为 BNF,再去使用它,将会导致尴尬的多解析树节点问题,所以我不认为这会是一种改进。...详情请看《Python之父新发文,将替换现有解析器》)
前言 本文将会从上下文无关文法开始介绍,从使用 BNF 描述语法到理解递归下降分析思想,最后实现一个简单的 html 解析器收尾。...使用 BNF 描述一下 js 中的简单语法,例如 数组语法: js 中数组源代码为: [1] [1, 2, 3] [1, 2, 3, ] 复制代码 用 bnf 表示: 一个元素 ARRAY ::= "[...下面使用 BNF 描述一下 html 语法(简略): 源代码: 复制代码 bnf 表示:...最后 使用 BNF 描述语法,然后按照 BNF 编写 语法单元 parser,最后将 parser 组合起来成为完整的 parser,这就是 Parser Combinators。...应用价值: 在编写 BNF 的时候,可以更好的理解编程语言语法设计理念。有助于写出能够被编译器优化的语法。
我们可以借助一个叫“BNF”的数学工具。...BNF与上下文无关文法 Backus-Naur符号(就是众所周知的BNF或Backus-Naur Form)是描述语言的形式化的数学方法,由John Backus (也许是Peter Naur)开发,最早用于描述...BNF类似一种数学游戏:从一个符号开始(叫做起始标志,实例中常用S表示),然后给出替换前面符号的规则。...BNF语法定义的语言是一个字符串集合,可以按照下述规则书写,这些规则叫做书写规范(产生式规则),例如一个四则运算表达式可以表示为: exp -> exp op exp | ( exp ) | number...EBNF EBNF是基本巴科斯范式(BNF)元语法符号表示法的一种扩展,主要对BNF中常见的两种情况,即重复项和可选项添加了相应的语法规则,如用方括号"[ … ]" 表示可选部分,用花括号"{ … }
我们一般的做法是使用正则表达来做这个事情,以 Python 为例,系统提供的 API 我们可以看做分三步走: import re pattern = "^([0-9])-([0-9]+)$" // 1....用 BNF 来表示你的 DSL 语法 BNF 的全称是 Backus–Naur form,是一种表示上下文无关语法的表示方式,Nearley 的语法基于 BNF 的扩展 EBNF(Extended Backus–Naur...至此如何书写 BNF 就介绍完了,你可以已经发现了,正则表达式也可以用 BNF 来表示,事实上正则也是上下文无关的问题,自然也就可以用 BNF 来表示。 2....生成 Parser 生成 Parser 会用到我们之前介绍到的 Nearley 框架,首先我们将上面给出的 BNF 语法定义保存到 grammar.ne 文件里。...react-excel-example.stackblitz.io/ 另外一个例子 为了加深理解,这里给出另外一个需求,将 MySQL 类似于 where 转换成云函数里面的 where 筛选的需求,给出 BNF
我希望能方便地给 markdown 解析器增加自定义的元素和解析逻辑,但现有的流行的库都有不同程度的不足: Python-Markdown, 文档极其简陋,我不知道有谁成功地给它写了扩展。...现在想来,我一个编译原理都没学过的野路子,连 FSM 和 BNF 都不知道,简直是不自量力。...以及观察 AST 结果 统一所有元素的接口,方便 subclass 扩展 直到动手做了之后我才知道我错了,CommonMark 的 spec 之变态导致我(菜得)只能(想出)线性解析4,而且我大胆猜测 BNF...而且,PDM 的 bug 都出得非常匪夷所思,就是一眼看不出来线索的那种,主要是路径也挺深,还各种不科学:只有 Linux 挂, 只有 Mac 挂, 只有 Python 3.7 挂,批跑挂单个跑不挂,本地跑不挂上...探其原因,都是我要对 Python 环境动手脚而自己作的死。 做开源,就是这样欣慰与闹心共存着的吧。
范式 BNF范式 分析 优先级 总结 练习 One more thing… 后记 Reference 新年第一更!...如有机会,我可能会开个坑详细写一写2333 再进一步:BNF范式 之前我提出了外向内表内向外的阅读方法。...不过这个仅仅是简单的总结,所以这一小节让我们再进一步深究下去,来从C语言的BNF文法中理解类型声明的语法。 BNF范式 如果你对BNF范式有一定了解,请跳过这一段直接去看“分析”节。...巴科斯范式(英语:Backus Normal Form,缩写为 BNF),又称为巴科斯-诺尔范式(英语:Backus-Naur Form,缩写同样为 BNF,也译为巴科斯-瑙尔范式、巴克斯-诺尔范式),...优先级 从BNF范式中,我们可以看出指针声明和其他声明的优先级。其中,括号对优先级最高。其次,数组和函数指针的优先级相同,而指针的优先级最低。
BNF范式与上下文无关文法 巴科斯范式 以美国人巴科斯(Backus)和丹麦人诺尔(Naur)的名字命名的一种形式化的语法表示方法,用来描述语法的一种形式体系,是一种典型的元语言。...BNF表示语法规则的方式为:非终结符用尖括号括起。每条规则的左部是一个非终结符,右部是由非终结符和终结符组成的一个符号串,中间一般以“::=”分开。...使用BNF范式进行定义,可以写成 ::=。...相信到这里小伙伴应该明白BNF范式的一些基本概念和使用方式了。 我们再来插入一个题外话,既然这里提到BNF范式是一种上下文无关文法,那什么是上下文、什么是上下文无关。...代码编写 上面的定义只是开胃菜,希望通过上面的描述,小伙伴能够理解BNF范式的应用,至于上下文无关和上下文有关。这些暂时不用考虑,毕竟我们目前还是在做上下文无关文法相关的内容。
像正则表达式的表达能力等价于正则文法一样,BNF范式的表达能力等价于上下文无关文法。BNF是“Backus Naur Form”的缩写。...BNF的元符号: ::=表示“定义为”,有的书上用–>|表示“或者”尖括号用于括起非终结符。...BNF的扩展EBNF: 可选项被括在元符号“[”和“]”中 重复项(零个或者多个)被括在元符号“{”和“}”中 仅一个字符的终结符用引号(“)引起来,以和元符号区别开来 上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述...BNF的扩展EBNF: 可选项被括在元符号“[”和“]”中 重复项(零个或者多个)被括在元符号“{”和“}”中 仅一个字符的终结符用引号(“)引起来,以和元符号区别开来 上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述
在编译原理领域,使用一个通用的表示方法来描述语法,这个方法就是上下文无关文法或BNF范式。...BNF范式构建 数学表达式的特点 运用编译原理的知识,编写一个自定义的解释器,我们需要如下三个步骤: BNF范式来描述游戏『公式』 词法分析器获得词法单元Token,对应的类是LexicalAnalyzer...算术表达式的BNF构建 通过对数学表达式的了解,我们知道一个数学表达式有数字、运算符等组成,并且运算符是左结合和有优先性,那怎样去构建它的BNF范式呢?...这个BNF范式的语法分析树为如下所示: ?...这个『公式』的语法往往是和上下文无关的,又被称为BNF范式。解释器的核心就是怎样构建一棵抽象的表达式树,这需要词法分析和语法分析的相关知识。
•JavaCC的允许扩展的BNF[5]规格-诸如(A)*,(A)+等-中的词汇和语法规格。扩展的BNF在某种程度上减轻了对左递归的需求。...实际上,A ::= y(x)*与相比,扩展BNF通常更容易阅读A ::= Ax|y。•词汇规范(例如正则表达式,字符串)和语法规范(BNF)都一起写在同一文件中。...8.更多详见BNF[8]说明 语法 PARSER_BEGIN(Example) /** Simple brace matcher. */ public class Example { /** Main.../wiki/Left_recursion [4] 非终结: https://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols [5] 扩展的BNF.../en.wikipedia.org/wiki/Lexical_analysis [7] 类似Lex: https://en.wikipedia.org/wiki/Lex_(software) [8] BNF
领取专属 10元无门槛券
手把手带您无忧上云