- 梳理第二章的内容,写一篇理解与总结。
我们都知道,一种语言必定他的文法去描述,它的完整定义包括语法和语义两个方面。语言和语法是指一组规则,用它可以形成和产生一个合适的程序。目前广泛使用的是上下文无关文法,也就是用上下文无关文法作为程序设计的描述工具,比如用A:=B+C表示是一个合法的赋值语句,则A:=B+就不是合法的赋值语句。
什么是文法?文法相当于语言学(人类语言)中的语义分析,即分析一个句所表示的含义。它是产生中间代码或目标代码的依据。
用EBNF(EBNF是一种称为扩展巴克斯范式的形式描述)表示就是:<句子> ::= <主语><谓语>
<主语> ::= <代词>< 名词>
<代词>::= 我 | 你 | 他
<名词>::= 王明 | 大学生 | 工人 | 英语
<谓语> ::= <动词><直接宾语>
<动词> ::= 是 | 学习
<直接宾语> ::=<代词> |<名词>
(1)文法的形式化定义:
- G=(VT , VN , P , S)
- VT:终结符集合,终结符是文法所定义的语言的基本符号,有时也称为token。
- VN:非终结符集合,非终结符是用来表示语法成分的符号,有时也称为"语法变量",可以推出其它的语法成分
- P:产生式集合
- S:开始符号
(2)符号串运算:
- 符号串的连接:εx=xε=x;
- 集合的乘积:AB={xy|x∈A,y∈B};{ε}A=A{ε}=A;
- 符号串的幂运算:x=abc,x^2=abcabc;
- 集合的幂运算
正闭包A+与闭包A*:A*={ε}∪A+
(3)文法分类:
(4)语言的定义与运算
语言:在某一确定字母表上的特定符号串的集合。 空集ε,集合{ ε }也是符合此定义的语言。
语言运算举例:
- L∪D 全部字母和数字的集合
- LD 由一个字母后跟一个数字组成的所有符号串的集合
- L4 由4个字母组成的所有符号串的集合
- L* 由字母组成的所有符号串(包括)的集合
- L(L∪D)* 以字母开头,后跟字母、数字组成的所有符号串的集合
- D+ 由一个或若干个数字组成的所有符号串的集合
(5)句型、句子和语言:
- 句型:S=*>x, x∈(Vn∪Vt)*,其中S=*>x为广义推导。
- 句子:S=*>x, x∈Vt*,其中S=*>x为广义推导,x必须是终结符的闭包(可为ε)。
- 语言:L(G[S])={x|S=+>x且x属于Vt*},其中S=+>x为推导,至少使用一次规则。
(6)语法树求短语、简单短语和句柄:
- 短语:子树的末端结点形成的符号串。
- 简单子树:只有一层分支的子树。
- 直接短语(简单短语):简单子树的末端结点形成的符号串。
- 句柄:子树中最左边的那棵只有父子两代的子树的所有叶结点自左至右排列起来,就是该句型的句柄。
(7)语义的二义性
如果文法G中的某个句子存在不只一棵语法树,则称该句子是二义性的。如果文法含有二义性的句子,则称该文法是二义性的。
2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)
整数n
n->1|2|3|...|9|n
标识符i
i->a|b|c|……|y|z|A|B|C|……|Y|Z1|2|3|...|9|_
表达式e
::= [+|-] <项> {<加减运算符><项>}
条件语句 ::= if <条件> then <语句>
赋值语句 ::= <id> :=<表达式>
复合语句 :: = begin<语句>{;<语句>} end
函数 ::= =<主函数>
程序 ::=<分程序>::=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>