1. 梳理第二章的内容,写一篇理解与总结。
第二章已经接近尾声了,下面来总结和梳理一下第二章的内容。第二章主要是介绍了文法和语言的概念,重点讨论上下文无关文法及其句型分析中的有关问题。本章主要涉及到文法的直观概念、符号和符号串、文法和语言的形式定义、文法的类型、上下文无关文法及其语法树、句型的分析等这几个内容。
(1)字母表:元素的非空有穷集合;
- 符号/字符:字母表中的元素;
- 符号串:符号的有穷序列。
(2)符号串运算:
- 符号串的连接:εx=xε=x;
- 集合的乘积:AB={xy|x∈A,y∈B};{ε}A=A{ε}=A;
- 符号串的幂运算:x=abc,x^2=abcabc;
- 集合的幂运算
- 正闭包A+与闭包A*:A*={ε}∪A+
(3)文法:文法是对语言结构的定义与描述。即从形式上用于描述和规定语言结构的称为"文法"(或称为"语法")
文法G定义为四元组(VN,VT,P,S),其中VN为非终结符,VT 终结符的非空有穷集,VN∩VT=Φ,P为产生式(规则)集合,S称作识别符或开始符。
(4)语言:
- 句型:由起始符推导出来的符号串。
- 句子:仅含有终结符合的句型。
- 语言:句子的集合。
(5)语法树:
- 短语:是句型中的某个非终结符所能推出的符号串。
- 直接短语:不能再推导出其他式子的符号串
- 句柄:最左的直接短语。
- 最左推导:每个推导过程都是从最左边的非终结符号的替换开始
- 最右推导:每个推导过程都是从最右边的非终结符号的替换开始 (最右推到常被称为规范推导)
(6)二义性:
- 如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义的。
- 若一个文法中存在某个句子,它有两个不同的最左(右)推导,则这个文法是二义的。
- 若一个句子中所有文法都是二义的,则该句子的语言是二义的。
2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)
(1)整数n:<数字> -> 0|1|2…7|8|9
G(N):N->n | nN
n->0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
(2)标识符i:<标识符> -> <字母>{<字母>|<数字>}
G=(VN,VT,P,S),
VN={I(标识符),L(字母),D(数字)}
VT={a,b,c,...,x,y,z,0,1,2,...,9}
P={ <I>-><L>,
<I>-><I><L>,
<I>-><I><D>,
<L>->a,
<L>->b,
....
<L>->z,
<D>->0,
<D>->1,
......
<D>->9}
S=<I>
I->L|IL|ID
L->{a|b|c|...|z}
D->{0|1|2|...|9}
(3)表达式e:<表达式> -> [+ | -] <项> { <加法运算符><项>}
(4)条件语句: <条件语句> -> IF <条件> THEN <语句>
(5)赋值语句:<赋值语句> -> <标识符> := <表达式>
(6)复合语句: <复合语句> -> BEGIN <语句> {;<语句>} END
(7)函数:<函数定义> -> <类型说明><函数名><复合语句>
(8)程序:<程序> -> <分程序>