1. 梳理第二章的内容,写一篇理解与总结。
(1)文法的形式定义
所谓文法就是描述语言的语法结构的形式规则。
文法的四元组:
VN为非终结符集
VT为终结符集
P为规则(α→β)的集合
S为识别符或开始符,至少要在一条规则中作为左部出现。
(2)文法的类型(文法分为0 型,1 型 ,2 型,3 型四种类型)
设G=( Vx,Vr,P,S),如果它的每个产生式a β是这样种结构: a∈(V,∪V~)°且至少含有一个非终结符,而β∈(VN∪V+)° ,则G是一个0型文法。
设G=( V;N,Vr,P,S)为一个文法,若P中的每一个产生式a→β均满足(β≥lal ,仅仅S→ε除外,则文法G是1型或上下文有关的。
设G=( VN,VzP.S),若P中的每一个产生式a β满足: a是一个非终结符,β∈(Vw∪Vr)* ,则此文法称为2型的或上下文无关的。
4种文法类型的定义是逐渐增加限制的,因此每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是O型文法。称O型语言。
(3)句子组成结构
(4)语言
推导:从开始符号出发,每个重写步骤把一个非终结符号替换为它的某个产生式体。
最左推导:总是选择每个句型的最左非终结符号。
最右推导:总是选择每个句型的最右非终结符号。
语法树:一种描述上下文无关文法的句型推导的直观工具,也称推导树。
文法的二义性:如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义的。
(5)句型分析
E Þ E + E ÞE + E * E
E Þ4 id + id * E
句型:如果SÞ*α,α∈(VT∪VN)*则称α是G产生的一个句型
2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)
整数n
<数字>->0|1|2...|8|9
标识符i
<标识符i>-><字母><数字>
表达式
<表达式>-> [+|-]<项>{<加减运算符><项>}
条件语句
<条件语句>-> if<条件>then<语句>
赋值语句
<赋值语句>-><标识符>-><表达式>
复合语句
<复合语句>-> begin<语句>{;<语句>} end
函数
程序
<程序>-><分程序>.
<分程序>->[<常量说明部分>] [<变量说明部分>][<过程说明部分>]<语句>