编译原理4 文法和语言总结与梳理
1. 梳理第二章的内容,写一篇理解与总结。
编译原理第二章文法与语言理解与总结:
一个程序设计语言是一个记号系统,如同自然语言一般,它的完善定义应该包括语法和语义两个方面。
就类似我们学习英语一样,语法是组织一切单词得出句意的手段,编译原理的语法亦是一样的。
而阐明语法的一个工具就是文法,知识形式语言理论的基本概念之一。
语言则就是我们的程序设计语言,每个句子构成的规律就是语法,每个句子的含义则是语义,每个句子和使用者的关系就是语用。
语法树:推导的图形表示,又称推导树。一棵有序有向树,因此具有树的性质;分析树的特点:每一个结点都有标记。
根结点由文法的开始符号标记; 每个内部结点由非终结符号标记,它的子结点由这个非终结符号的这次推导所用产生式的右部各符号从左到右依次标记;
叶结点由非终结符号或终结符号标记,它们从左到右排列起来,构成句型。
子树:分析树中一个特有的结点、连同它的全部后裔结点、连接这些结点的边、以及这些结点的标记。
树的根结点的标记可能不是文法的开始符号。 如果子树的根结点标记为非终结符号A,则可称该子树为A-子树。
短语:一棵子树的所有叶结点自左至右排列起来,形成此句型相对于该子树根的短语。
直接短语:分析树中只有父子两代的子树的所有叶结点自左至右排列起来,形成此句型相对于该子树根的直接短语。
句柄:分析树中最左边的那棵只有父子两代的子树的所有叶结点自左至右排列起来,就是该句型的句柄。
文法:语言中的每个句子可以用严格定义的规则来构造。通俗的讲就是:根据一些指定的规则,来确定编程语言的语法,从而实现编译器的功能。
任何一个文法都可以表示为一个四元组G=(VT,VN,S, φ)
VT是一个非空的有限集合,它的每个元素称为终结符号。
VN是一个非空的有限集合,它的每个元素称为非终结符号。 VT∩VN=φ
S是一个特殊的非终结符号,称为文法的开始符号。
φ是一个非空的有限集合,它的每个元素称为产生式。
如果两个文法产生的语言相同,则称这两个文法是等价的。
文法分类:0型文法、1型文法(上下文有关文法)、2型文法(上下文无关文法)、3型文法(正规文法)
最左推导:如果 a=>b,并且在每“一步推导”中,都替换a中最左边的非终结符号,则称这样的推导为最左推导。
最右推导:也称规范推导,如果 a=>b,并且在每“一步推导”中,都替换a中最右边的非终结符号,则称这样的推导为最右推导
引进文法的目的在于描述程序设计语言,是我们需要深入了解的重点。
2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)
整数n
标识符i
表达式e
条件语句
赋值语句
复合语句
函数
程序
...
答:PL/0语言文法:
整数n n::=0|1|2|3|4|5|6|7|8|9|....
标识符i i::=1|2|3|..|a|b|c|d|...
表达式e:G(e):e->e+T | e-T | T
T->T*F | T/F | F
F->(e) | i
语句: <语句> -> <赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<空>
条件语句:<条件语句>:=IF<条件>THEN<语句> <过程调用语句>::=CALL<标识符>
赋值语句: <赋值语句> -> <标识符>:=<表达式>
复合语句: <复合语句> -> begin<语句>{ ;<语句>}<end>
程序:<程序> -> <分程序>
<分程序> -> [<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>