1.梳理第二章的内容,写一篇理解与总结。
第二章,我们学习了文法和语言
1)首先,我们得先了解一下文法的概念。类似于平常说的汉语,也都是有语法的。简单一句“我是大学生”,就包含了主语、谓语、和宾语,用EBNF来表示的话就是如下这样
<句子>::=<主语>|<谓语>
<主语>::=<代词>|<名词>
<代词>::=我|你|他|它
<名词>::=教师|大学生|.....
<谓语>::=<动词>|<直接宾语>
<动词>::=是|学习.....
<直接宾语>::=<代词>|<名词>
一个句子的成分有很多,符合上述规则的句子才能成为结构合法的句子。这种规则和对语言的描述我们称之为文法
2)规则
规则也称重写规则、产生式或生成式。举个栗子,比如有一个规则A-->a,则称它是一条关于A的产生式。在这块便要提到文法四元组
先定义一个文法G为文法四元组(VN,VT,P,S),其中
VN为非终结符集;VT为终结符集;P为规则或产生式的集合;S称作识别符或开始符。VN,VT,P是非空有穷集!
举个例子
给定一个文法G=(VN,VT,P,S),VN={S},VT={0,1},P={S-->0S1,S-->01},S为开始符号
S可以接下去产生0S1,0S1可以接着产生00S11,可以接着生成下去的S就是非终结的、
而当S-->01的时候式子就终结了,因此0,1称作终结符,以上生成的式子就是生成式,S开始符的意思就不用多作解释了,字面意思
3)推导
对一个文法(如上)不断展开就能得到所相应的语言,如上面的文法描述的就是一个0n1n的语言,这个过程,也叫推导
还是上面的例子G(S):S-->01 | 0S1
0S1-->0011一步到位,换掉左边一个非终结符变成右边终极符形式,叫做直接推导,也称作一步推导
最左推导:如果在推导过程中每次都优先换掉最左边的非终结符,就是最左推导啦
最右推导:就是最左反过来,每次都先换最右边的非终结符。
举个例子,有文法: 找 i+i
G(E):
E=> E + T | T
T=>T * F | F
F=>(E)| i
最左:E --> E+T--->T+T--->F+T--->i+T -->i+F -->i+i
最右:E -->E+T -->E+F -->E+i -->T+i -->F+i -->i+i
4)分析树
分析树,又称推导树,是推导过程的图示化方法,是一棵有序有向树,因此具有树的性质。
还是上面的例子,找 i*i+i
最左推导:E=>E+T=>E+F=>E+i=>T+i=>T*F+i=>T*i+i=>F*i+i=>i*i+i
最右推导:E=>E+T=>T+T=>T*F+T=>F*F+T=>i*F+T=>i*i+T=>i*i+F=>i*i+i
推导树:
如上,每个叶节点按顺序排列,便能构成句型。其中,每个子节点往下都构成一个短语,而类似F-->i这种成为直接短语,最左边的直接短语称为句柄
而且从上面这个例子中能看出,最左推导和最右推导得出的推导树是一样的!
5)文法的类型
2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)
整数n n-->0|1|2|3|……|8|9
标识符i i->a|b|c|……|y|z|A|B|C|……|Y|Z (<字母>{<字母>|<数字>} )
表达式e ::= [+|-] <项> {<加减运算符><项>}
条件语句 ::= if <条件> then <语句>
赋值语句 ::= <id> :=<表达式>
复合语句 :: = begin<语句>{;<语句>} end
函数 ::= =<主函数>
程序 ::=<分程序>::=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>