1、梳理第二章的内容,写一篇理解与总结。
1、计算机的语言同中英文一样,都有自己独有的语法和规律,一定的规则可以判别句子结构合法与否,用这些规则描述句子的结构,这样的语言就是文法。是利用有限的集合(文法)来刻画无穷的集合(语种生成的句子)的一个工具。
正如汉语构成句子=主语+动词+谓语等汉字或者词组成语
程序设计语言句子=自己的符号+符号串
字母表是非空有限集合,所以字母表中的元素也成称为符号,字母表中的符号组成的任何有限序列称为符号串,符号串的顺序很重要,允许空符号串,用ε表示。符号串的运算一定要注意其顺序。
2、规则(重写规则、产生式、生成式)是形如A→B(A::=B)的(A,B)有序对。
文法G定义为四元组(Vn,VT,P,S)
VN:为非终结符(语法实体,或变量)集,常用大写字母表示;
VT:为终结符,常用小写字母表示;
P:为规则的集合,规则的左边属于V并且至少包含一个非终结符;
S:为识别符或是开始符,是一个非终结符,至少要在一条规则中作为左部出现。
推导是正向推导,归约是逆向推导。
3、文法的类型:
文法分为四种类型,0型、1型、2型、3型。
文法类型 |
又称 |
结构或定义 |
|
例子 |
0型文法 |
短语文法 |
α∈(VN∪VT)*,且至少含一个VN,而β∈(VN∪VT)* |
对产生式没有任何限制 |
S->A |
1型文法 |
上下文有关文法 |
若任一产生式α→β,都有|β|≥|α|,仅仅S→ε除外,产生式的形式描述:α1Aα2→α1βα2,A必须出现在上下文中才允许用β替换。 |
产生式的左边不止一个符号,但必须至少有一个非终结符 |
aSb->aaSbb S->ab |
2型文法 |
上下文无关文法 |
对任一产生式都有α∈VN,β∈(VN∪VT)* |
每个产生式左边只有一个终结符 |
G[S]: S→01 S→0S1 |
3型文法 |
正规文法 |
产生式的形式是A→aB或者是A→a |
左边只有一个终结符,右边为一个非终结符或是一个非终结符加一个终结符 |
G[S]: S→a S→aB |
4、语法树
给定文法G=(VN,VT,P,S),语法树的根为S,每个结点都有一个标记,是V的一个符号。
在推导的任何一步α=>β,其中α、β是句型,都是对α最左非终结符进行替换,则为最左推导;若是对α最右非终结符进行替换,则为最右推导,也称之为规范推导。
如果一个文法存在某个句子对应两颗不同的语法数,则这个文法是二义的。
句型:语法树从左至右的一个序列;
句子:语法树从左至右终结符序列,是句型中的一个;
语言:由文法产生的所有句子的集合;
短语:某子树的末端节点按自左向右顺序为句型的符号串,该符号串为该句型相对于该子树跟的短语;
简单短语:语法树的简单子树的叶子结点从左到右排列构成一个简单短语;
句柄:最左的简单短语。
2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)
整数n
n->0|1|2|3|……|8|9
标识符i
i->a|b|c|……|y|z|A|B|C|……|Y|Z
表达式e
e->[+|-]<项>{<加减运算符><项>}
<项>-><因子>{<乘除运算符><因子>}
<因子>->i|n|’(‘e’)’
<加减运算符>->+|-
<乘除运算符>*|/
条件语句
stmt->if<条件>then<语句>
<条件>->e<关系运算符>e|odd e
<语句>-><赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<空语句>
<关系运算符>->==|#|<|<=|>|>=
赋值语句
i=e
复合语句
stmt->begin <语句>{;<语句>} end
<语句>-><赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<空语句>
函数
<函数>-><主函数><其他函数>|<主函数>
程序
<程序>-><分程序>
<分程序>-><常量说明部分><语句>|<变量说明部分><语句>|<过程说明部分><语句>
<常量说明部分>->const<常量定义>{,<常量定义>};
<变量说明部分>->var i{,i};
<过程说明部分>-><过程首部><分程序>{;<过程说明部分>};
<过程首部>->procedure i;
<语句>-><赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<空语句>
<过程循环语句>call i
<当型调用语句>->while<条件>do<语句>
<读语句>->write’(‘e{,e}’)’
<写语句>->read’(‘i{,i}’)’
<空语句>->ε