【编译器学习】EBNF扩展巴科斯范式学习总结
EBNF扩展巴科斯范式学习总结
是一种描述计算机编程语言且与上下文无关(没有前置条件)的语法的一种语法表达式。简而言之,就是描述语言语法的规范。
EBNF的基本语法形式如下:
左手边(LeftHandSide) = 右手边(RightHandSide).
左手边叫非终端符号,也就说他还可以被其他表达式引用
右手边是非终端的组成。了解一个概念[终端符号与非终端符号], 终端符号就是可以认为是原子符号,或者认为是常量池量的常量,他是用来描述语法的最小粒子概念, 终端可以分为用户自定义的终端符号和规范中定义的终端符号,用户子定义的终端符号 ""引号 括起来,规范定义的引号会用粗体现实,他们常常出现在RightHandSide里,用来描述 一个非终端的组成, 形成 一个 完整production 定义。
production 就是一个完整的语法定义了。
比如
aa= "A"
bb = 3 * aa, "B";定义了一个语法 AAAB 其中aa 与 bb是语法的名称,他是一个非终端"A" "B" 是自定义的终端3 * 是一个规范定义的终端,表示 重复3次, 也是一个规范定义的终端,表示 连接符,可以看作是字符串concat函数
如下是ISO/IEC 14977 规范定义的终端符号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SSQp2hDq-1599655433786)(:/aaba21f3e30342879c6da3c5148cfcc9)]
这些符号分为两类,一类是具有优先级的连接符
另一类是具有改变优先级的括号
*repetition-symbol(重复符)
-except-symbol(除去符)
, concatenate-symbol(连接符)
| definition-separator-symbol
= defining-symbol(定义符)
; terminator-symbol(结束符)
. terminator-symbol(结束符)' first-quote-symbol first-quote-symbol ' (* 引用 *)
" second-quote-symbol second-quote-symbol " (* 引用 *)
(* start-comment-symbol end-comment-symbol *) (* 注释 *)
( start-group-symbol end-group-symbol ) (* 分组 *)
[ start-option-symbol end-option-symbol ] (* 可选 *)
{ start-repeat-symbol end-repeat-symbol } (* 重复 *)
? special-sequence-symbol special-sequence-symbol ? (* 特殊序列 *)
上面这些都很抽象,我们大概了解一下,关键我们掌握了,终端和非终端的概念,以及就像我们当初学习编程语言意义,掌握一些类似指令般的符号即可。
之后我们可以通过学习一些例值,正如我们当初学习hello world一样掌握EBNF的规律即可。
示例
以下提供一些示例以直观的理解EBNF。digit excluding zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
digit = "0" | digit excluding zero ;
natural number = digit excluding zero, { digit } ;
integer = "0" | [ "-" ], natural number ;digit excluding zero 可以是 1到9任意一个字符,digit则扩展为0到9任意一个字符。
natural number可以是1、2、…、10、…、12345、…,因为{}代表重复任意次,包括0次。
integer则可以是0或者可能带个负号的自然数。引用自 https://blog.csdn.net/lin_strong/article/details/78583543
非终端符号可以是任意你喜欢的名字,而终端符号则要不然是出现在被描述的语言中的标识符,要不然就是任何被引号括起来的字符序列。
然后Factor(参数)可以是终端字符、非终端字符、三种括号中任意一种括起来的表达式。
Term(术语)由起码一个Factor组合而成……
接下来我们看看如何利用EBNF定义一门编程语的语法,我们知道所有程序写出来都是有一个模板的,就好比Maven 代码生成器的archetype 骨架描述语言 (不了解maven archetype 骨架的自行学习,你会大有收获)
定义好骨架后,我们将程序员输入的代码用词法分析器拆成一个一个的单词按顺序放入数组中。
然后我们会用EBNF语法定义去匹配词法分析器得到的token数组,这个过程则是语法分析器做的事情了。如果命中语法,则会将其构造成一个AST对象,这个对象也就是语法分析器的产物了。
(如果不了解这个词法分析器和语法分析器的编译器原理的概念,请跳转https://blog.csdn.net/u010833547/article/details/108477528)
- 到这里我们以及知道EBNF在编译器工作过程中的作用,下面我们来看看一个用EBNF描述的一个只能赋值的类PASCAL编程语言:
引用自: https://blog.csdn.net/lin_strong/article/details/78583543(* a simple program syntax in EBNF − Wikipedia *)program = 'PROGRAM', white space, identifier, white space, 'BEGIN', white space, { assignment, ";", white space }, 'END.' ;identifier = alphabetic character, { alphabetic character | digit } ;number = [ "-" ], digit, { digit } ;string = '"' , { all characters - '"' }, '"' ;assignment = identifier , ":=" , ( number | identifier | string ) ;alphabetic character = "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" ;digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;white space = ? white space characters ? ;all characters = ? all visible characters ? ;对应的语法正确的程序如下:PROGRAM DEMO1BEGINA:=3;B:=45;H:=-100023;C:=A;D123:=B34A;BABOON:=GIRAFFE;TEXT:="Hello world!";END.
参考
[1] Freescale semiconductor. HC(S)08/RS08 and S12(X) Build Tools Utilities Manual. 2010
[2] Extended Backus–Naur form. https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form
[3] https://blog.csdn.net/lin_strong/article/details/78583543
【编译器学习】EBNF扩展巴科斯范式学习总结相关推荐
- java 范式 问号_巴科斯范式和扩展巴科斯范式
巴科斯范式(也称为巴科斯-瑙尔范式.巴克斯-诺尔范式)即 BNF 是一种用于表示上下文无关文法的语言,上下文无关文法描述了一类形式语言.尽管巴科斯范式也能表示一部分自然语言的语法,它还是更广泛地使用于 ...
- 扩展巴科斯范式(EBNF)简介
介绍 扩展巴科斯-瑙尔范式(Extended Backus–Naur Form,EBNF)是一种用于描述计算机编程语言等正式语言的与上下文无关语法的元语法(metasyntax)符号表示法.简而言之, ...
- ebnf范式_(4条消息)扩展巴科斯范式(EBNF)简介
介绍 扩展巴科斯-瑙尔范式(Extended Backus–Naur Form,EBNF)是一种用于描述计算机编程语言等正式语言的与上下文无关语法的元语法(metasyntax)符号表示法.简而言之, ...
- 扩展巴科斯范式 EBNF
EBNF Extended Backus–Naur Form 定义: 代码,如由终结符即可视字符.数字.标点符号.空白字符等组成的计算机程序的源代码. | 竖杠表示可供选择, "-" ...
- 什么是BNF EBNF 巴科斯范式及其扩展 BNF Augmented BNF
什么是BNF范式,什么又是EBNF范式? 巴科斯范式及其扩展 BNF & Augmented BNF 什么是巴科斯范式? 巴科斯范式(BNF: Bac ...
- 语法分析:LL(1)语法分析的实现及扩展的巴科斯范式
终于港到实现.. LL(1)文法与LL(1)分析 当一个文法满足以下条件时,称这个语法为LL(1)语法,LL(1)语法可以通过LL(1)的分析方法进行分析 文法不含有左递归 同一非终结符的FIRST集 ...
- 巴科斯范式(BNR范式,Backus-Naur Form)
前言: 当你搜索看到这篇文章时,我想你已经有了 动机来了解什么是巴科斯范式(BNR范式,Backus-Naur Form).对于本人而言,我是因为需要看一门编程语言的IEEE标准文档而需要了解BNR范 ...
- CS【1】:巴科斯范式(BNF: Backus-Naur Form)介绍与例子
太幸运了,今天考试刚刚考到,把笔记放出来哦 有时间更新一下原题 巴科斯范式 (BNF: Backus-Naur Form 的缩写)描述计算机语言语法的符号集 在双引号中的字("word&qu ...
- 巴科斯范式BNF: Backus-Naur Form介绍
巴科斯范式(BNF: Backus-Naur Form. 的缩写)是由 John Backus 和 Peter Naur 首次引入一种形式化符号来描述给定语言的语法(最早用于描述ALGOL 60 编程 ...
最新文章
- 有了Gradle,还会选Maven吗?
- 从零开始学_JavaScript_系列(24)——查看对象属性,合并数组
- python3 处理 html转义字符
- python计算相关系数
- final在java中的含义_在java中一个类被声明为final类型,表示的意思是()
- [PTA]L2-001 紧急救援 (25 分)
- python基础===利用unittest进行测试用例执行的几种方式
- java todo error_Java全局异常处理(TODO)
- 测试beta测试_重新想象不断变化的自动化世界中的Beta测试
- 纯手写实现HashMap
- 安卓显示视频画面的动画效果及代码
- 控制台 钢铁雄心2_钢铁雄心4控制台 (2)
- java 动态生成表格_js中动态生成表格
- 学习笔记02-虚拟机安装Windows server 2008 r2
- MapGIS完美转ArcGIS ShapeFile攻略
- php datedif,Excel Datedif函数全面解析及BUG分析
- 浏览量(PV)、访客数(UV)、访问次数、跳出率是什么意思?
- elasticsearch _cat命令使用详情
- 一些国外的免费网站模板网站
- 【转】超星转PDF最佳方法(对打印机重新审视)
热门文章
- 页面宽度超过浏览器调试屏幕或手机屏幕宽度
- 100PB!互联网史上最大规模数据迁移之一:115科技迁至阿里云
- kodi直播电视,电视台分类管理,想看哪个一目了然
- mysql考勤数据库设计_MySQL 数据库设计总结
- CAD牙孔lisp_分解vlx - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
- 计算机真值、原码、反码、补码、移码
- html5走格子游戏,JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
- IDEA远程连接数据库
- 如何在Unity实现从纹理中生成法线贴图?
- 3.博客系统| 设计系统首页(文章列表渲染)