文法和语言总结与梳理
1.梳理第二章的内容,写一篇理解与总结。
答:知识梳理1.字母表:一个有限的字符集。例子:C语言的字母表
(1)大小写英文字母 a ~ z, A ~ Z
(2)数字 0 ~ 9
(3) 特殊字符
2. 单词符号:是语言中具有独立意义的最基本结构
3. 语法单位:由单词符号构成的更大的结构
一般包括: 表达式 语句 分程序(语句块)函数(有返回值)
语义是指这样的一组规则,使用它可以定义一个程序的意义。
名字和标识符:
标识符:以字母开头后跟字母数字组成字符串 例 PI、nm1
名字:当给标识符一定意义时,该标识符成为名字 例 PI :π(圆周率)
(变量名,函数名,类名,常量名,对象名等)
类型:以什么方式存放、大小、运算操作
作用域:全局变量,局部变量,静态函数
字母表:由若干元素组成的有限非空集合,用∑表示,它的每个元素称为一个符号。
符号串: 由∑中的符号所构成的有穷序列。
空字:不包含符号的序列称为空字,记为ε。
V的闭包:
令: V* = V0∪V1∪V2È…
称 V*是V的闭包。
V的正则包(正闭包,正则闭包):
记V+ = VV*, 称 V+是V的正则包,即V+ =V1∪V2∪V3È…。
文法是描述语言的语法结构的形式规则(即语法规则)
上下文无关文法的特点
它所定义的语法范畴(或语法单位)是完全独立于这种范畴可能出现的环境的。
特点:独立性
缺点:不能用来描述自然语言
一个上下文无关文法G包括四个组成部分:一组终结符号,一组非终结符,一个开始符号,以及一组产生式。
终结符号:乃是组成语言的基本符号,即在程序语言中以前屡次提到的单词符号,如基本字,标识符,常数,算符和界符等.
非终结符号(也称语法变量):用来代表语法范畴。如“算术表达式”“布尔表达式”“过程”等。
一个非终结符代表一个一定的语法概念。因此非终结符是一个类(或集合)记号,而不是个体记号。
如:{E,T,F}
开始符号:是一个特殊的非终结符号,它代表所定义的语言中我们最感兴趣的语法范畴。
例:P(代表一个程序)
高级语言的定义
任何语言实现的基础是语言定义,程序语言主要由语法和语义两个方面定义。语法,即一组规则,一部分称为词法规则,另一部分称为语法规则。语义,即符合构成规范的句子,要考虑意义,是指一组规则,使用它可以定义一个程序的意义。
高级语言的一般特征
程序设计语言的一般特性:程序结构、数据类型与操作、语句、控制结构。(关于标识符的笔记:程序运行时,同一名在不同时间也可代表不同的存储单元;同意存储单元也可能有几个不同的名字。)
程序语言的语法描述
与文法定义有关的几个术语:字母表,符号,符号串,空字等。【注】用S*表示S上的所有符号穿的全体,空字也包括在其中。符号串的运算有连接,方幂,符号串集合的运算有和,连接积。此外,要注意,V+是V的正则闭包,V+=VV*,相当于无空字符串存在。
上下文无关文法
文法是描述语言的语法结构的形式规则。上下文无关文法所定义的语法范畴是完全独立于这种范畴可能出现的环境的。不宜于描述任何自然语言。对于一个句子,可以用直接推导或者图示化的方法来推导。上下文无关文法由四元组组成:一组终结符号(组成语言的基本符号,如基本字、标识符、常数、算符和界符等),一组非终结符号(代表语法范畴,如算术表达式),一个开始符号(特殊非终结符),以及一组产生式(定义语法范畴的书写规则,一个产生式的形式:A→a)。
语言的定义:
假定G是一个文法,S是它的开始符号。如果S (a (表示从S出发,经0步或若干步可推出a),则称a是一个句型。仅含终结符号的句型是一个句子。文法G所产生的句子的全体是一个语言,将它记为L(G).
L(G)={a|S a & a∈VT }
要掌握产生式和语言之间的转换,掌握最左(最右)推导。
语法分析树与二义性
语法分析树:简称语法树,用来表示推导过程。
不唯一性:一个句型并不是只对应一棵语法树。
如果一个文法存在某个句子对应两颗不同的语法树,则称这个文法是二义的。ps:文法二义性≠语言二义性。二义原因:没有定义运算符优先级和结合性。消除方法:定义优先级和结合性。
2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)
整数n
标识符i
表达式e
条件语句
赋值语句
复合语句
函数
程序
...
答:
<程序> -> <分程序>
<分程序> -> [<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>
<常量说明部分> -> CONST<常量定义>{ ,<常量定义>};
<常量定义> -> <标识符>=<无符号整数>
<无符号整数> -> <数字>{<数字>}
<变量说明部分> -> VAR<标识符>{ ,<标识符>};
<标识符> -> <字母>{<字母>|<数字>}
<过程说明部分> -> <过程首部><分程度>;{<过程说明部分>}
<过程首部> -> procedure<标识符>;
<语句> -> <赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<空>
<赋值语句> -> <标识符>:=<表达式>
<复合语句> -> begin<语句>{ ;<语句>}<end>
<条件> -> <表达式><关系运算符><表达式>|odd<表达式>
<表达式> -> [+|-]<项>{<加减运算符><项>}
<项> -> <因子>{<乘除运算符><因子>}
<因子> -> <标识符>|<无符号整数>|(<表达式>)
<加减运符> -> +|-
<乘除运算符> -> *|/
<关系运算符> -> =|#|<|<=|>|>=
<条件语句> -> if<条件>then<语句>
<过程调用语句> -> call<标识符>
<当型循环语句> -> while<条件>do<语句>
<读语句> -> read(<标识符>{ ,<标识符>})
<写语句> -> write(<标识符>{,<标识符>})
<字母> -> a|b|c…x|y|z
<数字> -> 0|1|2…7|8|9