文法和语言总结与梳理
Posted mrj1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文法和语言总结与梳理相关的知识,希望对你有一定的参考价值。
1.文法和语言的总结
(1)文法的直观概念
人们无法列出全部句子,但人们可给出一些规则来组成句子结构。汉语句子可以由主语后随谓语而成,构成谓语的是动词和直接宾语,采用第一章的EBNF来表示这种构成规则。
(2)符号和符号串
字母表:符号的非空有限集合,典型的符号是字母、数字、各种标点和运算符等。
符号串:由字母表中的符号组成的任何有穷序列称为符号串.,允许有空符号串,用E表示,其长度为0,即|E|=0.
(3)文法和语言的形式定义
文法是对语言结构的定义与描述,即从形式上描述和规定语言结构,也称为语法。任何一个文法都可以表示为一个四元组G=(VN,VT,P,S)。VN是一个非空的有限集合,它的每个元素称为非终结符号。VT是一个非空的有限集合,的每个元素称为终结符号。P是一个非空的有限集合,它的每个元素称为产生式。S是一个特殊的非终结符号,称为文法的开始符号。
(4)文法的类型
0型文法/无限制文法:α->β,其中α∈(Vn∪Vt)*且至少含有一个非终结符,β∈(Vn∪Vt)*。
1型文法/上下文有关文法:αAβ->αuβ,其中A∈Vn,α,β∈(Vn∪Vt)*,u∈(Vn∪Vt)+。
2型文法/上下文无关文法:A->β,其中A∈Vn,β∈(Vn∪Vt)*。常用于句法分析。
3型文法/正规文法:常用于词法分析。
(5)上下文无关文法及其语法树
语法树是句子结构的图形表示,是按照某一规则进行推导时所形成的树。分析树的特点:每一个结点都有标记。根结点由文法的开始符号标记;
每个内部结点由非终结符号标记,它的子结点由这个非终结符号的这次推导所用产生式的右部各符号从左到右依次标记;叶结点由非终结符号或终
结 符号标记,它们从左到右排列起来,构成句型。
最左推导:如果a =>β,并且在每“一步推导”中,都替换α中最左边的非终结符号,则称这样的推导为最左推导。
最右推导:如果a =>β,并且在每“一步推导”中,都替换α中最右边的非终结符号,则称这样的推导为最右推导。也称作规范推导
二义性:如果一个文法的某个句子有不止一棵分析树,则这个句子是二义性的句子。 含有二义性句子的文法是二义性的文法。
有部分语言不存在无二义性的文法,这样的语言称为二义性的语言,二义性问题是不可判定的。
(6)句型分析
短语:是句型中的某个非终结符所能推出的符号串。
直接短语:不能再推导出其他式子的符号串
句柄:最左的直接短语。
2.PL/0 语言的文法
整数n
<整数> ::= [-] <数字> {<数字>}
<数字> ::= 0 | 1 | 2 | 3 | …| 7 | 8 | 9
标识符i
<标识符> ::= <字母>{<字母>|<数字>}
<字母> ::= a | b | c | … | X | Y | Z
<数字> ::= 0 | 1 | 2 | 3 | …| 7 | 8 | 9
表达式e
<表达式> ::= [+|-]<项>{<加减运算符><项>}
<加法运算符> ::= + | -
<乘法运算符> ::= * | /
<项> ::= <因子> { <乘法运算符> <因子> }
<因子> ::= <标识符> | <无符号整数> | ‘(‘ <表达式> ‘)‘
<无符号整数> ::= <数字> { <数字> }
<标识符i> ::= <字母> { <字母> | <数字> }
<数字> ::= 0 | 1 | 2 | 3 | …| 7 | 8 | 9
<字母> ::= a | b | c | … | X | Y | Z
条件语句
<条件语句> ::= if<条件>then<语句>
<条件> ::= <表达式> <关系运算符> <表达式> | odd <表达式>
<语句> ::= <赋值语句> | <条件语句> | <当型循环语句> | <过程调用语句> | <读语句> | <写语句> | <复合语句> | <空语句>
<关系运算符> ::= = | # | < | <= | > | >=
<赋值语句> ::= <标识符id> := <表达式>
<条件语句> ::= if<条件>then<语句>
<当型循环语句> ::= while <条件> do <语句>
<过程调用语句> ::= call <标识符>
<读语句> ::= read ‘(‘ <标识符> {,<标识符>} ‘)‘
<写语句> ::= write ‘(‘ <表达式> {, <表达式>} ‘)‘
<复合语句> ::= begin <语句> {;<语句>} end
赋值语句
<赋值语句> ::= <id>:=<表达式>
<标识符id> ::= <字母> { <字母> | <数字> }
<表达式> ::= [+|-] <项> { <加减运算符> <项> }
复合语句
<复合语句> ::= begin<语句>{;<语句>}end
<语句> ::= <赋值语句> | <条件语句> | <当型循环语句> | <过程调用语句> | <读语句> | <写语句> | <复合语句> | <空语句>
函数
<函数定义>::=<类型说明><函数名><复合语句>
<复合语句> ::= begin <语句> {;<语句>} end
<语句> ::= <赋值语句> | <条件语句> | <当型循环语句> | <过程调用语句> | <读语句> | <写语句> | <复合语句> | <空语句>
程序
<程序> ::= <分程序>
<分程序> ::= [<常量说明部分>] [<变量说明部分>][<过程说明部分>] <语句>
<常量说明部分> ::= const <常量定义> { ,<常量定义> } ;
<常量定义> ::= <标识符> = <无符号整数>
<无符号整数> ::= <数字> {<数字>}
<变量说明部分> ::=var<标识符 > { , <标识符 > } ;
<标识符> ::= <字母> {<字母>|<数字>}
<过程说明部分> ::= <过程首部><分程序>{; <过程说明部分> };
<过程首部> ::= procedure <标识符> ;
以上是关于文法和语言总结与梳理的主要内容,如果未能解决你的问题,请参考以下文章