1. 梳理第二章的内容,写一篇理解与总结。
通过第二章的我了解最深刻的有:文法的形式定义、短语文法、上下文有关文法、上下文无关文法、正规文法;推导、短语、分析树、二义性。我知道了程序设计语言与自然语言是举报相同的,都包括语言、单词和语句,所以对我们这些程序员来说程序设计语言是一种基本语言,我们应该掌握。
文法:所谓文法就是描述语言的语法结构的形式规则。任何一个文法可以表示为一个四元组。形式文法描述形式语言的基本想法是,从一个特殊的初始符号出发,不断的应用一些产生式规则,从而生成出一个字串的集合。产生式规则指定了某些符号组合如何被另外一些符号组合替换。
0型文法:0型文法也称短语文法。一个非常重要的理论结果是:0型文法的能力相当于图灵机。或者说,任何0型文语言都是递归可枚举的,反之,递归可枚举集必定是一个0型语言。0型文法是这几类文法中,限制最少的一个,所以我们在试题中见到的,至少是0型文法。
1型文法:1型文法也叫上下文有关文法,此文法对应于线性有界自动机。它是在0型文法的基础上每一个α→β,都有|β|>=|α|。这里的|β|表示的是β的长度。
2型文法:2型文法也叫上下文无关文法,它对应于下推自动机。2型文法是在1型文法的基础上,再满足:每一个α→β都有α是非终结符。如A->Ba,符合2型文法要求。
3型文法也叫正规文法,它对应于有限状态自动机。正规文法有多种等价的定义,我们可以用左线性文法或者右线性文法来等价地定义正规文法。左线性文法要求产生式的左侧只能包含一个非终结符号,产生式的右侧只能是空串、一个终结符号或者一个非终结符号後随一个终结符号。右线性文法要求产生式的左侧只能包含一个非终结符号,产生式的右侧只能是空串、一个终结符号或者一个终结符号後随一个非终结符号。 它是在2型文法的基础上满足:A→α|αB(右线性)或A→α|Bα(左线性)。
推导:文法推导有最左推导、最右推导(规范推导)。在刚开始接触推导时我是不怎么明白的,不过通过复习和百度学习有了一定的了解但是还是不太熟练,所以在这一方面我还要继续努力。
句型、句子和语言:假定G是一个文法,S是它的开始符号,如果
*
S => α
则称α是一个句型;仅含终结符的句型是一个句子;文法G所产生的句子的全体是一个语言,记为L(G)。其实我不太了解这些概念所以在写短语、直接短语和句柄经常出错。
短语、直接短语和句柄:一个句型的语法树中任一子树叶结点所组成的符号串都是该句型的短语;如果子树中不再包含其他的子树,即A只能推导出b,而b不能再推出其他的式子,则b为此句型的直接短语;直接短语中的最左直接短语为该句型的句柄。
分析树:推导的图形表示,又称推导树。分析树的特点:①每一个结点都有标记。② 根结点由文法的开始符号标记;③ 每个内部结点由非终结符号标记,它的子结点由这个非终结符号的这次推导所用产生式的右部各符号从左到右依次标记; ④叶结点由非终结符号或终结符号标记,它们从左到右排列起来,构成句型。推导和语法树是这一章节的最主要部分,我掌握的不太理想,所以我在这一方面还要继续加强。
二定义:如果一个文法的某个句子有不止一棵分析树,则这个句子是二义性的句子。 含有二义性句子的文法是二义性的文法。由二定义文法我知道了语法树不是唯一的。有时,一个二义性的文法可以变换为一个等价的、无二义性的文法。可以找出一些充分条件(未必是必要条件),当文法满足这些条件时,就可以确信该文法是无二义性的。
总结:通过这一章节的学习我基本了解了程序设计语言,知道了编译原理是我们程序员必须了解的语言。但是在我学习过程中也认识到了自己的不足,对一些知识点理解的还不够透彻,尤其在这一章的推导和语法树方面还要不断的练习和提高。总体来说这一门语言不是很难,注重的是理解,只要理解了就很容易掌握了,所以我会再接再厉的!
2. 尝试写出PL/0 语言的文法。
①整数n
<整数n> ::= <数字>
②标识符i
<标识符i> ::= <字母>
③表达式e
<表达式e> ::= [+|-]<项>{<加减运算符><项>}
<加减运算符>::= +|-
<项>::= <因子>{<乘除运算符><因子>}
<因子>::= <id>|<integer>|'('<表达式>')'
<乘除运算符>::= *|/
④条件语句
<条件语句>::= if<条件>then<语句>
<条件> ::= <表达式><关系运算符><表达式>|odd<表达式>
<语句> ::= <赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<重复语句>|<空语句>
⑤赋值语句
<赋值语句>::= <id>:=<表达式>
⑥复合语句
<复合语句>::= begin<语句>{;<语句>} end
⑦函数
<函数>::=<主函数><其他函数>|<主函数>
⑧程序
<程序> ::= <分程序>
<分程序> ::= [<常量说明部分>][变量说明部分>]{<过程说明部分>}<语句>
<常量说明部分> ::= const<常量定义>{,<常量定义>};
<变量说明部分>::= var<标识符>{,<标识符>};