EBNF 😃
扩展巴克斯-瑙尔范式(EBNF。Extended Backus-Naur Form)是表达作为描述计算机编程语言和形式语言的正规方式的上下文无关文法的元语法符号表示法。它是基本巴克斯范式(BNF)元语法符号表示法的一种扩展(精确描述语言的一种语言,所以称为元语法符号表示法)
戳后面链接仔细查看定义得出自己的想法,有疑问请不吝赐教,/抱拳了!EBNF。
形式语言 😃
在数学,逻辑和计算机科学中,形式语言是用精确的数学或机器可处理的公式定义的语言。
文法
文法是形式语言理论的基本概念之一,是阐明语法的一个工具。由于语法只是定义了什么样的符号序列是合法的,使得语言可以有无穷多个句子;为了用适当条数的规则把语言的全部句子描述出来,可以说文法是以有穷的集合刻画无穷的集合一个工具。
上下文无关文法 😃
上下文无关文法(英语:context-free grammar,缩写为CFG)。我的理解是给一个例子:
我第一次认识小白兔的时候,觉得小白兔可爱,灵活,爱吃胡萝卜;无论过去多少年,无论我和小白兔各自经历了什么事情,再次遇见她的时候,我们仍然认为小白兔可爱,灵活,爱吃胡萝卜(形容词都不变)。
也许理解会有偏差,所以附上一个链接上下文无关文法。
正则语言 😃
正则语言又称正规语言是满足下述相互等价的一组条件的一类形式语言:
(都是知识点)
确定有限状态自动机
非确定有限状态自动机
- 可以被非确定有限状态自动机(通过其可以实现上一个状态对下多个状态的转变,故最终的下一个状态不确定)识别;
图灵机
- 可以被只读图灵机(将人的计算行为抽象掉的数学逻辑机)识别;
正则表达式
- 可以用正则表达式描述;
正则文法
- 可以用正则文法生成。
前缀文法
- 可以用前缀文法生成。
PL/0 😃
PL0语言可以看成是Pascal语言的子集(原来是一种语言而已)。正在学习的书籍是清华大学出版社张素琴等五位老师编写的《编译原理(第3版)》。PL/0语言编译系统的源语言是PL/0语言,目标语言是类P-code语言。
PL/0语言语法的EBNF描述(内容来自《编译原理(第3版)》)
PL/0语法单位 | EBNF描述
<程序> | ::= <分程序>.
<分程序> | ::= [<常量说明部分>][变量说明部分>][<过程说明部分>]<语句>
<常量说明部分> | ::= const<常量定义>{,<常量定义>};
<常量定义> | ::= <id>=<integer>
<无符号整数> | ::= <数字>{<数字>}
<标识符> | ::= <字母>{<字母>|<数字>}
<变量说明部分> | ::= var<id>{,<id>};
<过程说明部分> | ::= <过程首部><分程序>;{<过程说明部分>}
<过程首部> | ::= procedure<id>;
<语句> | ::= <赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<重复语句>|<空语句>
<赋值语句> | ::= <id>:=<表达式>
<复合语句> | ::= begin<语句>{;<语句>}end
<空语句> | ::=
<条件> | ::= <表达式><关系运算符><表达式>|odd<表达式>
<表达式> | ::= [+|-]<项>{<加法运算符><项>}
<项> | ::= <因子>{<乘法运算符><因子>}
<因子> | ::= <标识符>|<无符号整数>|'('<表达式>')'
<加减运算符> | ::= +|-
<乘除运算符> | ::= *|/
<关系运算符> | ::= =|#|<|<=|>|>=
<条件语句> | ::= if<条件>then<语句>
<过程调用语句> | ::= call<标识符>
<当型循环语句> | ::= while<条件>do<语句>
<读语句> | ::= read'('<id>{,<id>}')'
<写语句> | ::= write'('<表达式>{,<表达式>}')'
// 以下来自https://www.jianshu.com/p/a6c93ca376d4
<重复语句> | ::= repeat<语句>{;<语句>}until<条件>
<字母> | ::= a|b|...|X|Y|Z
<数字> | ::= 0|1|2|...|8|9
EBNF元符号的含义如下:
- < >、用尖括号括起来的中文字表示语法构造成分,或称语法单元;而用尖括号括起来的英文字表示一类词法单元。
- ::= 、表示左部的语法单位由右部定义,可读作“定义为”。
- | 、表示“或”,即多选项。
- {} :用花括号括起来的成分可以重复0次到任意多次。
- [] :用方括号括起来的成员为任选项,即出现一次或不出现。
实现编译功能试验的博客链接:
2021.01.27