语言和文法
语言的三个基本要素:语法语义,语用
语言和文法——用文法描述语言
上下文无关文法
![]()
P(语法符号) X1X2X……Xn
![]()
赋值语句 变量 = 表达式;
文法G定义为四元组(VT, Vn, S, P)
Vt是有限的终极符集合。
Vn是有限的非终极符号
S是开始符号,并且S属于Vn
P是产生式(规则)的集合。
基本概念:
![]()
![]()
![]()
直接推到:如果A β是一个产生式,则有α1Aα2 α1βα2,这时候称α1βα2是由α1Aα2一步推到而来的。
![]()
A +β,表示A通过一步或者多部可推导出β
![]()
A *β:表示A通过零步或者多步可推导出β
句型:
![]()
设有文法G,如果有S *β,则称符号串β为G的句型。我们用SF(G)表示文法G的所有句型。这是一个很重要的概念,说的是如果从一个文法的开始符号可以推导出的任何东西都是该文法的句型。
句子:
设β为文法G的一个句型,且β只含有终极符,则称β为G的句子。也就是说,文法G的句子是从开始符推导出的,同时只含有终极符的串。
语言:
![]()
L(G) = {u|S +u,u∈Vt* }.文法G所定义的语言是其所有的句子的集合。
基本概念与高级语言程序
每一种高级程序设计语言都有自己的语法
符合高级语言文法的程序就是该语法的句子
所有程序组成的集合就构成了语言。
验证程序是不是语法的句子
最基本的方法:采用类搜索算法,从开始符出发进行推导
用剪枝来提高效率
两种基本思想
自顶向下的语法分析:从开始符推导出程序
自底向上的语法分析:从程序出发,用规则的左部替换规则的右部。一直规约到开始符号
短语:
![]()
![]()
设S是文法的开始符,有S *α1Aα2,如果有A +β,则称β是句型α1βα2的一个短语(注意:短语定义在句型上,短语是从非终极符推出,β由一个非终极符推导出来。)
简单短语:
![]()
![]()
设S是文法的开始符,有S *α1Aα2,如果有A β(一步推导)β,则称β是句型α1βα2的一个简单短语。
句柄:
句型中的最左简单短语称为句柄。
![]()
E E+T | T
![]()
T T * F | F
![]()
F (E) | i(标识符)
文法的开始符是E,非终极符是E , T, F,终极符是(,),*,+
问(T+i)*F + i是不是文法的句型,有哪些是短语,简单短语,句柄是那个
E→E+T
→T+T
→T*F+T
→F*F+T
→(E)*F+T
→(E+T)*F+T
→(T+T)*F+T
→(T+F)*F+T
→(T+i)*F+T
→(T+i)*F+i
短语:
整个的肯定是短语由E推导出来,(T+i)*F是由T推出来的
两个i;(T+i); T ; (T+i)
![]()
咱们看着个定义哈,设S是文法的开始符,有S *α1Aα2,如果有A +β,则称β是句型
α1βα2的一个短语(注意:短语定义在句型上,短语是从非终极符推出,β由一个非终极符推导出来。)也就是说,我们要这么理解,α1βα2是我们从开始符号推导出来的一个句型,其中有一部分,或者说一个字串β,可以由一个非终极符经过一步或者多部推导出来,而α1Aα2又可以从开始符号经过0步或者多部推导出来。我们就说β是一个短语,因为它作为一个整体可以被另一非终极符推导而来。
我们说(T+i)*F是一个短语是因为,它是由T经过多部推导出来的,而T又可以从开始符号E经过一次推导而出
(T+i)是短语是因为由E经过多次推导而出的,而E可以由开始符号经过零次推导出来。
T+i是短语是因为它可以由E经过多次推导出来,而E由开始符号经过零次推导得出
左边的i可以由T一次推导出来,而T可以由开始符号一次推导而出,所以左边的i是一个短语
T是一个短语是因为它可以由E经过一次推导而出,而E可以从开始符号经过零次推导而出。
右边的i可以由T经过一次推导出来,而T可以由开始符号经过一次推导出来。
简单短语:
T, 两个i
最左简单短语:句柄
T
![]()
直接左递归 若有E Eα形式的规则,则称E是直接左递归的
![]()
直接右递归:若有E αE形式的规则,则称E直接右递归的
左递归
右递归
![]()
递归 E +α1Eα2
最左推导:
如果进行推导时选择的市句型中的最左(右)非终极符,则称这种推导为最左推导(右)
左右句型:用最左方式导出的句型称作左句型,用最右推导的方式导出的句型称作右句型
结论:每个句子都有相应的最右和最左推导(但对句型而言此结论不成立。)
文法分类
0型文法:也称短语文法
![]()
产生式规则具有以下形式,α β,其中α中至少含有一个非终极符。同时α和β是终极符和非终极符的并集的星闭包
1型文法:上下文有关文法。0型文法的特例
要求|α|<=|β|(规则左部长度小于等于规则右部长度)
2型文法:上下文无关文法
![右箭头:]()
要求产生式左部是一个非终极符A β
3型文法:
也称为正则文法。是2型文法的特例,即产生式的右部至多有两个符号,而且具有下面的形式之一
![]()
A a
![]()
A aB.3型文法描述能力最弱,与DFA,Regex描述能力相当
按照描述能力的强弱,我们做出下面的顺序
0>1>2>3
语言和文法
语言的三个基本要素:语法语义,语用
语言和文法——用文法描述语言
上下文无关文法
![]()
P(语法符号) X1X2X……Xn
![]()
赋值语句 变量 = 表达式;
文法G定义为四元组(VT, Vn, S, P)
Vt是有限的终极符集合。
Vn是有限的非终极符号
S是开始符号,并且S属于Vn
P是产生式(规则)的集合。
基本概念:
![]()
![]()
![]()
直接推到:如果A β是一个产生式,则有α1Aα2 α1βα2,这时候称α1βα2是由α1Aα2一步推到而来的。
![]()
A +β,表示A通过一步或者多部可推导出β
![]()
A *β:表示A通过零步或者多步可推导出β
句型:
![]()
设有文法G,如果有S *β,则称符号串β为G的句型。我们用SF(G)表示文法G的所有句型。这是一个很重要的概念,说的是如果从一个文法的开始符号可以推导出的任何东西都是该文法的句型。
句子:
设β为文法G的一个句型,且β只含有终极符,则称β为G的句子。也就是说,文法G的句子是从开始符推导出的,同时只含有终极符的串。
语言:
![]()
L(G) = {u|S +u,u∈Vt* }.文法G所定义的语言是其所有的句子的集合。
基本概念与高级语言程序
每一种高级程序设计语言都有自己的语法
符合高级语言文法的程序就是该语法的句子
所有程序组成的集合就构成了语言。
验证程序是不是语法的句子
最基本的方法:采用类搜索算法,从开始符出发进行推导
用剪枝来提高效率
两种基本思想
自顶向下的语法分析:从开始符推导出程序
自底向上的语法分析:从程序出发,用规则的左部替换规则的右部。一直规约到开始符号
短语:
![]()
![]()
设S是文法的开始符,有S *α1Aα2,如果有A +β,则称β是句型α1βα2的一个短语(注意:短语定义在句型上,短语是从非终极符推出,β由一个非终极符推导出来。)
简单短语:
![]()
![]()
设S是文法的开始符,有S *α1Aα2,如果有A β(一步推导)β,则称β是句型α1βα2的一个简单短语。
句柄:
句型中的最左简单短语称为句柄。
![]()
E E+T | T
![]()
T T * F | F
![]()
F (E) | i(标识符)
文法的开始符是E,非终极符是E , T, F,终极符是(,),*,+
问(T+i)*F + i是不是文法的句型,有哪些是短语,简单短语,句柄是那个
E→E+T
→T+T
→T*F+T
→F*F+T
→(E)*F+T
→(E+T)*F+T
→(T+T)*F+T
→(T+F)*F+T
→(T+i)*F+T
→(T+i)*F+i
短语:
整个的肯定是短语由E推导出来,(T+i)*F是由T推出来的
两个i;(T+i); T ; (T+i)
![]()
咱们看着个定义哈,设S是文法的开始符,有S *α1Aα2,如果有A +β,则称β是句型
α1βα2的一个短语(注意:短语定义在句型上,短语是从非终极符推出,β由一个非终极符推导出来。)也就是说,我们要这么理解,α1βα2是我们从开始符号推导出来的一个句型,其中有一部分,或者说一个字串β,可以由一个非终极符经过一步或者多部推导出来,而α1Aα2又可以从开始符号经过0步或者多部推导出来。我们就说β是一个短语,因为它作为一个整体可以被另一非终极符推导而来。
我们说(T+i)*F是一个短语是因为,它是由T经过多部推导出来的,而T又可以从开始符号E经过一次推导而出
(T+i)是短语是因为由E经过多次推导而出的,而E可以由开始符号经过零次推导出来。
T+i是短语是因为它可以由E经过多次推导出来,而E由开始符号经过零次推导得出
左边的i可以由T一次推导出来,而T可以由开始符号一次推导而出,所以左边的i是一个短语
T是一个短语是因为它可以由E经过一次推导而出,而E可以从开始符号经过零次推导而出。
右边的i可以由T经过一次推导出来,而T可以由开始符号经过一次推导出来。
简单短语:
T, 两个i
最左简单短语:句柄
T
![]()
直接左递归 若有E Eα形式的规则,则称E是直接左递归的
![]()
直接右递归:若有E αE形式的规则,则称E直接右递归的
左递归
右递归
![]()
递归 E +α1Eα2
最左推导:
如果进行推导时选择的市句型中的最左(右)非终极符,则称这种推导为最左推导(右)
左右句型:用最左方式导出的句型称作左句型,用最右推导的方式导出的句型称作右句型
结论:每个句子都有相应的最右和最左推导(但对句型而言此结论不成立。)
文法分类
0型文法:也称短语文法
![]()
产生式规则具有以下形式,α β,其中α中至少含有一个非终极符。同时α和β是终极符和非终极符的并集的星闭包
1型文法:上下文有关文法。0型文法的特例
要求|α|<=|β|(规则左部长度小于等于规则右部长度)
2型文法:上下文无关文法
![右箭头:]()
要求产生式左部是一个非终极符A β
3型文法:
也称为正则文法。是2型文法的特例,即产生式的右部至多有两个符号,而且具有下面的形式之一
![]()
A a
![]()
A aB.3型文法描述能力最弱,与DFA,Regex描述能力相当
按照描述能力的强弱,我们做出下面的顺序
0>1>2>3