1、语法制导翻译
--------------------------------------
(1)语法制导翻译(SDTS)直观上就是为每个产生式配上一个翻译子程序(称之为予以动作或者
语义子程序),并且在执行语法分析的时候执行这些子程序。
(2)语法分析过程中,当一个产生式获得匹配(对于自上而下的分析)或用于规约(对自下而上
的分析)时,产生式相应的语义子程序进入工作完成既定的任务。
(3)示例1:
* 【题目】令S.val为文法G[S]生成的二进制数的值,例如对输入串101.101,则
S.val=5.625。按照语法制导翻译方法的思想,给出计算S.val的相应的语义
规则,G(S)如下:
G[S]: S→L.L|L
L→LB|B
B→0|1
*【解答】计算S.val的文法G′[S]及语义动作如下:
产生式 语义动作
G′[S]:S′→S {print(S.val)}
S→L1·L2 {S.val:=L1.val + L2.val/2L2.length}
S→L {S.val:=L.val}
L→L1B {L.val:=L1.val*2 + B.val
L.length:=L1.length +1}
L→B {L.val:=B.val L.length:=2}
B→1 {B.val:=1}
B→0 {B.val:=0}
2、逆波兰表示法
----------------------------------
(1)如果E是变量或者常数,则E的后缀为其本身;
(2)如果E为 E1 op E2的形式,则其后缀表示为 E1'E2'op;
(3)如果E的形式为(E),则与E的后缀表示相同。
(4)后缀表达方式中,操作数的出现顺序是相同的。
(5)示例
【题目】有一语法制导翻译如下所示:
S→bAb {print″1″}
A→(B {print″2″}
A→a {print″3″}
B→Aa) {print″4″}
若输入序列为b(((aa)a)a)b,且采用自下而上的分析方法,求输出序列。
【解答】当采用自上而下的方式来构造其语法树时,如下:
S
/ | \
b A b 1 //(((aa)a)a)
/ \
( B 2 //((aa)a)a)
/|\
A a ) 4 //((aa)a)
/ \
( B 2 //(aa)a)
/|\
A a ) 4 //(aa)
/ \
( B 2 //aa)
/|\
A a ) 4 //a
|
a 3 //
这里题目采用的是自下而上的分析方式,则其输出序列为34242421
3、编译原理的基本概念
-------------------------------------
(1)编译程序是将高级语言的源程序作为输入并转化为低级语言的目标代码的程序。
(2)编译程序是将高级语言转化为低级语言,低级语言包括汇编语言和及其语言,而
汇编程序则是将汇编语言转化为机器语言。
(3)解释程序与编译程序的区别是解释程序逐行读取源程序并执行,这个过程中不会
产生目标代码。解释程序在执行速度上比编译的慢,但是人机交互界面要好。
(4)源程序是指用高级语言书写的程序,而目标程序是指计算机所能识别的机器代码。
(5)编译过程:词法分析、语法分析、语义分析与中间代码生成、优化与目标代码生成。
以及贯穿整个过程的表格管理和出错处理。
(6)一个编译任务可以分为很多遍来完成,其中完成某些特定的功能称之为一遍。
(7)自编译是指使用高级语言来写自己的编译器。
(8)交叉编译是指在A机器上开发运行与B机器上的编译器。
(9)自展是先定义好一个核心的简单语言L0,用汇编语言或者机器语言书写这个简单语言
L0的编译器T0,然后将L0扩充为L1,使用自编译的方式用L0来书写L1的编译器T1,这样
不断地进行扩充直到满足所有的功能为止。
(10)移植是指在A机器上运行的程序只要稍加改动就可以在B机器上运行。
4、词法分析的基本概念
--------------------------------------
(1)词法分析接收的输入是源程序代码,输出的是单词符号串。
(2)词法分析的两种组织形式:
一是将词法分析作为单独的一遍来进行。
二是将词法分析作为语法分析的一个子程序来进行。
(3)扫描器即词法分析器。
(4)单词是最小的具有明确语义的语法单位。
(5)词法分析器输出的单词采用二元组进行保存,即(单词种别,单词自身的值)。
(6)单词的分类:保留字,标识符,常量,运算符和界符。
(7)状态转换图,即表示不同的输入下的状态之间的转换。
5、正规表达式
--------------------------------------
(1)正规表达式是一种形式化的表示方法,表示单词符号的结构,从而精确地定义单词集。
(2)运算规则
-- 给定字母表Z
-- e和q是Z上的一个正规式,则其正规集分别为{e}{q}。
-- 对任意a属于Z,a的正规式为 {a}
-- 若S和R是Z上的正规式,对其正规集L(R)和L(S),有:
R|S是Z上的正规式,其正规集为 L(R)UL(S)
R·S是Z上的正规式,其正规集为L(R)L(S)
(R)*是Z上的正规式,其正规集为(L(R))*
-- 任何正规式都有正规集 E
-- R|S = S|R
(3)示例:
【例2.1】令Z={a,b},R=a(a|b)*是Z上的正规式,求R的正规集。
【解答】L(R) = L(a(a|b)*)
= L(a)L((a|b)*)
= L(a)(L(a)UL(b))*
={a}{a,b}*
={e,a,aa,ab,aaa,aab,...}
【例2.2】判断下列正规式是否等价
(a|b)*与a*|b* (ab)*与a*b* (a|b)*与(a*b*)*
【解答】
(1)L((a|b)*)表示任意有a和b组成的字母串
L(a*|b*)表示任意a在b前的字母串,所以不等价
(2)L((ab)*)={e,ab,abab,ababab,...}
L(a*b*) ={e,a,b,aa,ab,aaa,aab,...}所以不等价
(3)L((a|b)*)= {a,b}* = {e,a,aa,ab,aaa...}
L((a*b*)*)=({a}*{b}*)*={e,a,aa,ab,aaa...}所以等价
【例2.3】证明L(a+) = {a}* -{e}
【解答】
L(a+) = {a*} - {e}
= {e,a,aa,aaa,...}-{e}
= {a,aa,aaa,...}
= {a}{e,a,aa,aaa,...}
= L(aa*)
所以 a+ = aa*
【习题2.4】正规式(ab)*a与正规式a(ba)*是否等价?请说明理由。
【解答】
L((ab)*a)与L(a(ba)*)的最简NFA相同,所以等价。
6、有限自动机
--------------------------------------
(1)表示方法:五元组(S,Z,f,S0,z)
S:状态集
Z:字母表
f:映射关系
s0:初态
z:终态
(2)确定有限自动机DFA:f为单值映射
(3)非确定有限自动机NFA:f为多值映射
(4)状态转换图和状态转换矩阵
【例题2.4】假定DFA Md=({s0,s1,s2},{a,b},f,s0,{s2}):
f:
f(s0,a) = s1 f(s0,b) = s2
f(s1,a) = s1 f(s1,b) = s2
f(s2,a) = s2 f(s2,b) = s1
试着给出Md的状态转换图和状态转换矩阵。
【解答】
状态转化图略
状态转换矩阵如下
a b
s0 s1 s2
s1 s1 s2
s2 s2 s1
【例题2.5】假定NFA Md=({s0,s1,s2},{a,b},f,{s0,s2},{s1})有:
f:
f(s0,a) = {s2} f(s0,b) = {s0,s1}
f(s1,a) = null f(s1,b) = {s2}
f(s2,a) = null f(s2,b) = {s1}
试着给出Md的状态转换图和状态转换矩阵。
【解答】
状态转换矩阵如下:
a b
s0 {s2} {s0, s2}
s1 - {s2}
s2 - {s1}
【习题2.5】设有L(G)={a2n+1b2ma2p+1| n≥0,p≥0,m≥1}
(1) 给出描述该语言的正规表达式;
(2) 构造识别该语言的确定有限自动机(可直接用状态图形式给出)。
【解答】
(1)a(aa)*bb(bb)*a(aa)*
(2)画出状态转换图、写出状态转换矩阵、重命名、确定化NFA
【习题2.6】对给定的表达式b*(d|ad)(b|ab)+构造其NFA M
7、NFA的确定化及其化简
---------------------------------------------
(1)采用子集法确定化NFA
首先定义FAM的一个状态子集I的e_闭包,即e_closure(I),
若si 属于 I ,则si 包含于 e_闭包
若si 属于 I ,则从si出发经过e通路所能到达的任何状态sj,都有sj包含于e_闭包。
Ia表示从某一状态出发经过有向边a而能到达的状态集。
(2)确定化方法
*构造一张转换表,第一列为状态子集I,对不同的a属于Z单设一列Ia
*表的第一行第一类为I的e_闭包(s0),其中s0为初始状态。
*为每一个新产生的状态添加一行,直到没有新的状态出现为止
*重命名表格
(3)确定化DFA的化简
*将DFA的状态集划分为终点集合非终点集。
*对非终点集中的状态逐一检查
【例2.8】正规表达式(a|b)*(aa|bb)(a|b)*的NFA M如图所示,试着确定化DFA M'
【解答】
(1)由状态转换图得:
I Ia Ib
{X,1,2} {1,2,3} {1,2,4}
{1,2,3} {1,2,3,5,6,Y}{1,2,4}
{1,2,4} {1,2,3} {1,2,4,5,6,Y}
{1,2,3,5,6,Y}{1,2,3,5,6,Y}{1,2,4,6,Y}
{1,2,4,5,6,Y}{1,2,3,6,Y} {1,2,4,5,6,Y}
{1,2,4,6,Y} {1,2,3,6,Y} {1,2,4,5,6,Y}
{1,2,3,6,Y} {1,2,3,5,6,Y}{1,2,4,6,Y}
(2)重新命名得:
I Ia Ib
0 1 2
1 3 2
2 1 4
3 3 5
4 6 4
5 6 4
6 3 5
(3)重新绘制状态图 DFA M
【例2.9】化简2.8中的DFA M’
【解答】
(1)终态集为{3,4,5,6},非终态集为{0,1,2}
(2)对非终态集{0,1,2}a进行考察,其中
{0}a = {1}
{2}a = {1}
{1}a = {3} 分别属于终态集合非终态集,故划分为{0,2}和{1}
(3)对{0,2}b进行考察
{0}b = {2}
{2}b = {4} 分别属于非终态集和终态集,故划分为{0}和{2}
(4)对终态集{3,4,5,6}a进行考察
{3}a = {3}
{4}a = {6}
{5}a = {6}
{6}a = {3}
(5)对终态集{3,4,5,6}b进行考察
{3}b = {5}
{4}b = {4}
{5}b = {4}
{6}b = {5} 故不进行划分
(6)重新命名{0},{1},{2},{3,4,5,6}为0,1,2,3,得到化简后的矩阵
I Ia Ib
0 1 2
1 3 2
2 1 3
3 3 3
(7)重新绘制状态转换图,得到化简后的DFA M'
【例2.10】使用DFA的等价性证明正规表达式(a|b)*与(a*b*)*等价
【解答】
(1)画出两者的状态转换图
(2)写出状态转换表
(3)重命名状态转换表得到状态转化矩阵
(4)化简状态转化矩阵
(5)得到最终的化简后的DFA
【例2.13】已知Z={a,b},求以字符串中每个a都直接至少有一个b跟在其后面。
(1)确定其正规表达式为:b*(abb*)*
(2)画出其状态图
(3)画出其状态转换表
(4)重命名得到状态关系矩阵
(5)化简矩阵
(6)得到DFA M’
【习题2.6】有语言L={w | w<-(0,1)+},并且w中至少有两个1,又在任何两个1
之间有偶数个0},试着构造其有限状态自动机DFA。
【解答】
(1)确定其正规表达式为:0*1(00(00)*1)*(00)(00)*1*0
(2) 画出其状态转化图
(3) 画出其状态转化表
(4) 重命名得到状态转换矩阵
(5) 化简
(6) 得到确定化的DFA
8、语法分析基本概念
-----------------------------------------
(1)语言:对于字母表Z的所有集合Z*的一个子集称为Z上的一个语言。
(2)语句:对于语言中的没一个字符串称之为语句。
(3)文法:文法通常用四元组组成,G[S]=(Vt,Vn,S,s);
Vt表示非终结符
Vn表示终结符
S是一个特殊的非终结符,是我们所关注的文法开始符
s表示产生式集合。
(4)终结符:语言中不可再分的基本符号。
(5)开始符:是我们关注的语法实体,即语言的目标。
(6)产生式:是定义语法实体的一种书写规则。
(7)句型:文法G[S]中有S =*=> a,则a是文法G的一个句型。
(8)句子:文法G[S]中有S =*=> a,且a属于终结符,则a是文法G的一个句子。
(9)最左推导:每次都对句型的最左非终结符开始进行推导。
(10)最右推导:每次都对句型的最右非终结符进行推导。
(11)短语:asp是文法G[s]的一个句型,若有A=+=>s,则s是A的一个短语。
(12)直接短语:只推导一次的短语
(13)句柄:一个句型的最左直接短语。
(14)素短语:含有终结符的短语。而且不存在具有相同性质的真子串。
(15)文法的二义性:如果一个文法产生多个语法树,则是二义性的。
【例3.1】构造产生标识符的文法
【解答】
标识符有字母开头,有字母和数字组成的字母数字串。
(1)定义字母集: D--> a|b|c|...|z
(2)定义数字集: L--> 0|1|2|...|9
(3)定义字母或数字: T --> L|D
(4)定义字母数字串: S --> T|ST
(5)定义标识符: I --> L|LS
故产生的文法G[I]为:
G[I]=({0,1,...a,b,..z},{D,L,T,S,I},I,s)
s:
I --> L|LS
S --> T|ST
T --> L|D
D --> a|b|c|..|z
L --> 0|1|2|3|...|9
【例3.2】写一个文法使其语言是奇数集合,但不允许出现以0开头的奇数
【解答】
(1)定义最高位:F --> 1|2|3|...|9
(2)定义最低位:B --> 1|3|5|7|9
(3)定义中间部分:M --> 0|1|2|...|9
(4)定义非最低位:S --> F|FM
(5)定义非零开头的奇数: I --> S|SB
故产生的文法为:
G[I] = ({0,1,2,...9},{F,B,M,S,I},I,s)
s:
I --> S|SB
S --> F|FM
M --> 0|1|2|...|9
B --> 1|3|5|7|9
F --> 1|2|...|9
9、文法的分类
----------------------------------------------
(1)0型文法: a-->b,其中a 至少含有一个非终结符,识别的系统是图灵机。
(2)1型文法: aAb --> acb,上下文有关文法,A只有在上下文中才可以被替换。
(3)2型文法: A --> a 其中a是终结符
(4)3型文法: A --> a 或 A --> aB
(5)四种文法的区别与联系
*从0--3文法逐渐加强
*1-3型文法属于0型文法
*2-3 不一定属于1型文法
*1型文法中不允许出项 A-->a的情况
*0、1型文法的产生式左部含有终结符号的符号串或者两个及两个以上的非终结符。
*2、3型文法的产生式左部只允许出现单个的非终结符。
【例3.4】给出字母表Z={a,b}上同时只有奇数个a和奇数个b的所有字符串集合的正规
文法。
【解答】
(1)画出该正规文法的DFA
(2)定义产生式集合s
S --> aA|bB
A --> aS|bC|b
B --> bS|aC|a
C --> bA|aB|e
(6)二义性文法的消除
*消除左递归
*消除回溯
【习题3.3】已知文法G[S]为S→aSb|Sb|b,试证明文法G[S]为二义文法。
【解答】
构造出两棵不同的语法树即可。
【习题3.4】已知文法G[S]为S→SaS|ε,试证明文法G[S]为二义文法。
【解答】构造出两棵不同的语法树即可。
【习题3.6】有文法G[S]: S→aAcB|Bd
A→AaB|c
B→bScA|b
(1) 试求句型aAaBcbbdcc和aAcbBdcc的句柄;
(2) 写出句子acabcbbdcc的最左推导过程。
【解答】
(1)构造其分析语法树
s
/ / \ \
a A c B
/|\ / | | \
A a B b S c A
/ \ |
B d c
|
b 所以句柄为AaB
s
/ / \ \
a A c B
/ / \ \
b S c A
/ \ |
B d c 所以句柄为Bd
(2)acabcbbdcc
S
/ / \ \
a A c B
/|\ \ \ \ \
A a B b S c A
| | /\ |
c b B d c
|
b
所以推导过程为:S aAcB aAaBcB acaBcB acabcB acabcbScA
acabcbBdcA acabcbbdcA acabcbbdcc
【习题3.7】对于文法G[S]: S→(L)|aS|a
L→L,S|S
(1) 画出句型(S,(a))的语法树;
(2) 写出上述句型的所有短语、直接短语、句柄、素短语和最左素短语。
【解答】
(1)
S
/ | \
( L )
/|\
L , S
| / | \
S ( L )
|
S
|
a
(2)短语:S,a,(a),S,(a),(S,(a))
直接短语:a,S
句柄: S
素短语:a
最左素短语:a
11、LL(1)分析法:预测分析法
--------------------------------------------------
(1)第一个L表示自顶向下、自左向右扫描输入串。第二个L表示分析过程中使用
最左推导。1表示向右查看一个符号就可以决定如何推导。
(2)输入串是待分析的符号串,以界符#作为结束标志。由程序自动生成。
(3)分析栈中存放文法符号,刚开始存放一个#,当输入串的指针也指向#时,分析成功。
(4)LL(1)分析表的构造
First集合:a是文法G[s]的一符号串,First(s)={a|s=*=>a,a属于非终结符}
Follow集合:Follow(a)={a|S*=>...Aa...}
(5)若X-->a... 则a属于First(X)。
若X-->Y... 则{First(Y)-e}属于First(X)。
若A-->aBb 则{First(b)-e}属于Follow(B)。
(6)LL(1)中的First(A)与Follow(A)相交为空。
【例3.7】下面是LL(1)分析表,试对输入串aadl的分析过程。
a b l d #
A A->aA'
A' A'->ABl A'->e A'->e
B B ->dB'
B' B'->bB' B'->e
【解答】
符号栈 当前符号 输入串
#A a adl#
#A'a a adl#
#A' a dl#
#lBA a dl#
#lBA'a a dl#
#lBA' d l#
#lB d l#
#lB'd d l#
#lB' l #
#l 1 #
# #
【习题3.10】已知文法G[A]: A→aABl|a
B→Bb|d
(1) 试给出与G[A]等价的LL(1)文法G[A′];
(2) 构造G[A′]的LL(1)分析表;
(3) 给出输入串aadl#的分析过程。
【解答】
(3)符号栈 当前符号 输入串
#A a adl#
#A'a a adl#
#A' a dl#
#lBA a dl#
#lBA'a a dl#
#lBA' d l#
#lB d l#
#lB'd d l#
#lB' l #
#l 1 #
# #
【习题3.2】令文法G[N]为
G[N]: N→D|ND
D→0|1|2|3|4|5|6|7|8|9
(1) G[N]的语言L(G[N])是什么?
(2) 给出句子0127、34和568的最左推导和最右推导。
【解答】
(1)非负整数
(2)NND NDD NDDD DDDD 0DDD 01DD 012D 0127
N ND N7 ND7 N27 ND27 N127 D127 0127
【习题3.13】设有文法G[S]: S→a|b|(A)
A→SdA|S
(1) 构造算符优先关系表;
(2) 给出句型(SdSdS)的短语、简单短语、句柄、素短语和最左素短语;
(3) 给出输入串(adb)#的分析过程。
【解答】
(3)符号栈 输入串 说明
# (adb)# 移进
#( adb)# 移进
#(a db)# S-->a规约
#(S db)# 移进
#(Sd b)# 移进
#(Sdb )# S-->b进行规约
#(SdS )# 移进
#(SdA )# A-->S进行规约
#(A )# 移进
#(A) )# S-->(A)进行规约
#S # 分析成功
【习题3.25】给出文法G[S]及图3-16所示的LR(1)项目集规范族中的0、1、2、3、4。
G[S]: S→S;B | B
B→BaA | A
A→b(S)
12、算符优先分析法
--------------------------------------
(1)算符优先是一种自底向上的分析方法。
(2)所谓算符优先,就是依照算数表达式的四则运算过程来进行语法分析。即这种分析方法
要预先规定运算符之间的优先关系和综合性质,然后借助这个关系来确定句型的可规约
来进行规约。
(3)任何产生式的右部都不含两个并列的非终结符的文法为算符文法。
(4)若P->...aB... B=+=>b 则 a<b
若P->...Ab... A=+=>a 则 a>b
若P->...ab... 则 a=b
(5)文法G[s]中任何一个产生式的右部都不含相邻的两个终结符,即为算符文法。而算符
优先文法中存在明确的算符优先顺序。在语法树上,下层的算符的优先级比上层的算
符的优先级高。
(6)若P->a...或者P->Qa... 则a属于FirstVt(P);
若P->Q... 则FirstVt(Q)包含于FirstVt(P)
(7)若有产生式P->...a或者P->...aQ 则a属于LastVt(P)
若有产生式P->...Q 则LastVt(Q)包含于LastVt(P)
【例3.11】说明下列文法是否是一个算符优先文法。
G[E]:E->E+E|E*E|(E)|i
【解答】
(1)首先文法中的任何一个产生式都不存在两个相邻的非终结符,所以属于算符
文法。
(2)有E->E+E,第二个E可以推出E->E*E,所以+<*
在E->E+E,第一个E可以推出E->E*E,所以*<+
所以不是算符优先算法。
【例3.12】构造下列文法的算符优先关系表
G[E]: E->E+T|T
T->T*F|F
F->(E)|i
【解答】
(1)由E->+....|E->i,所以FirstVt(E) = {+,i}
(2)由T->*....,所以FirstVt(T)={*}
(3)由F->(....|i,所以FirstVt(F)={(,i}
(4)由E->T,所以FirstVt(T)属于FirstVt(E),所以FirstVt(E)={+,i,*,(}
(5)由T-<F,所以FirstVt(F)属于FirstVt(T),所以FirstVt(T)={*,(,i}
(6)由E-> ...+T,所以LastVt(E)={+}
(7)由T-> ...*F,所以LastVt(T)={*}
(8)由F-> ...)|i,所以LastVt(F)={),i}
(9)由T->F,所以LastVt(F)包含于LastVt(T),所以LastVt(T)={*,),i}
(10)由E->T,所以LastVt(T)包含于LastVt(E),所以LastVt(E)={+,*,),i}
(11)由E->(E),所以 ( = )
(12)由E->...+T,所以,+ < FirstVt(T)
(13)由E->...*F,所以,* < FirstVt(F)
(14)由E->E+...,所以,+ < LastVt(E)
(15)由E->T*...,所以 * < LastVt(T)
(16)由F->(E...,所以 ( < FirstVt(E)
(17)由F-> E)..,所以 )< LastVt(E)
+ * i ( ) #
+ > < < < > >
* > > < < > >
i > > > >
( < < < < =
) > > > >
# < < < < =
【例3.14】输入串i+i*i的分析过程,算符优先算法
【解答】
符号栈 输入串 动作
# i+i*i# #<i
#i +i*i# #<i>+用F->i规约
#F +i*i# #<+
#F+ i*i# #<
...
[词法分析]
词法分析从左向右扫描每行源程序的符号,按照词法规则,从构成源程序的字符串中识别
出一个个具有独立意义的最小语法单位,并转换成同意的内部表示,送给语法分析程序。
[LL(1)文法]
若文件的任何两个产生式 A--> a|b都满足下面两个条件
(1)First(a)交First(b)为空集
(2)若b经过若干步骤可以推导为e(空集),那么First(a)交Follow(A)为空集。
第一个L表示从左向右进行扫描,第二个L表示最左推导。1表示决定分析器的每个
动作时向前看一个输入符号。没有公因子,不是二义性的,也不含左递归。
[语法树]
句子的树结构表示法称为语法树(语法分析树或语法推导树)。
给定文法G=(VN,VT,P,S),对于G的任何句型都能构造与之关联的
语法树。这棵树具有下列特征:
(1)根节点的标记是开始符号S。
(2)每个节点的标记都是V中的一个符号。
(3)若一棵子树的根节点为A,且其所有直接子孙的标记从左向右的排列
次序为A1A2…AR,那么AA1A2…AR一定是P中的一条产生式。
(4)若一标记为A的节点至少有一个除它以外的子孙,则A VN。
(5)若树的所有叶节点上的标记从左到右排列为字符串w,则w是文法G
的句型;若w中仅含终结符号,则w为文法G所产生的句子。
[LR(0)分析器]
所谓LR(0)分析,是指从左至右扫描和自底向上的语法分析,且在分析的
每一步,只须根据分析栈当前已移进和归约出的全部文法符号,并至多再
向前查看0个输入符号,就能确定相对于某一产生式左部符号的句柄是否
已在分析栈的顶部形成,从而也就可以确定当前所应采取的分析动作 (是
移进还是按某一产生式进行归约等)。
[语言和文法]
文法就是语言结构的定义和描述,是有穷非空的产生式集合。
文法G定义为四元组的形式:
G=(VN,VT,P,S)
其中:VN 是非空有穷集合,称为非终结符号集合;VT 是非空有穷集合,
称为终结符号集合;P是产生式的集合(非空);S是开始符号(或识别符号)。
这里,VN∩VT=,S VN。V=VN∪VT,称为文法G的字母表,它是出现
文法产生式中的一切符号的集合。
文法G所描述的语言用L(G)表示,它由文法G所产生的全部句子组成,即
L(G)={x| SÞ*x,其中S为文法开始符号,且 }
简单的说,文法描述的语言是该文法一切句子的集合。