编译原理----文法和语言

字母表:符号的非空有限集。  例如∑={0,1,2}

 

符号:字母表中的元素。  例如:1

 

符号串:由字母表中的符号组成的任何有穷序列。  例如:01,012012,......

 

空符号串:ε

 

问:符号就是字符对吗?

答:不对。符号还可以是字符串,如C语言字母表中的符号{if,else,for......}

 

符号串的前后缀:从符号串S的尾部(头部)删去若干个(包括0个)符号之后所剩下的部分称为S的前(后)缀。

例如:011的前缀:ε,0,01,011

   011的后缀:011,11,1,ε

 

符号串集合:若集合A中的一切元素都是某字母表上的符号串,则称A为该字母表上的符号串集合。  例如:∑={a,b,c}   A={aa,ab,ac}

 

符号串的连接运算:符号串X和Y的连接是把Y的符号写在X的符号之后得到的符号串XY。

例如:X=01,Y=10,则XY=0110。

对于任意符号串S有:εS=Sε=S

 

符号串的幂运算:符号串自身连接n次得到的符号串Sn=SS...SS。

例如:S=01, 则S0=ε,S1=01,S2=0101,......

 

符号串集合的乘积:设A,B为符号串集合,则A和B的乘机定义为:AB={xy|x∈A,y∈B}

例如:A={a,b},B={c,d}  ,则AB={ac,ad,bc,bd}

 

符号串集合的幂运算:例如A={0,1} 则A0={ε},A1={0,1},A2={00,01,10,11}

 

符号串集合的闭包运算:

A+=A1∪A2∪A3∪A4∪........       称为A的正闭包

A*=A0∪A+          称为A的闭包

 例如:A={x,y} ,则A+={x,y,xx,xy,yx,yy,......} ,A*={ε,x,y,xx,xy,yx,yy,......} 

 

语言:是由句子组成的集合,是有一组符号所构成的集合

 

文法:是对语言结构的定义和描述(或称“语法”)

 

文法的形式定义:G[S]=(VN,VT,P,S)

          VN:非终结符号集

          VT:终结符号集

          P:规则的集合

          S:开始符号

 

直接推导:用产生式的右部替换产生式的左部

直接规约:用产生式的左部替换产生式的右部

 

文法和语言的分类:0型,1型,2型,3型

0型文法:产生式左边始终包含至少一个非终结符号。(对0型文法做出某些限制可以的得到1,2,3型文法)。

1型文法:(上下文有关),aAb-->aBb只有在这样的a,b上下文中才能把A改写为B。

2型文法:(上下文无关),产生式左边一个非终结符号,右边为符号串(可以为空)。

3型文法:(正则文法),产生式左边一个非终结符号,右边只能为一个终结符号或者一个终结符号加一个非终结符号。A->Ba左线型,A->aB右线型。

 

 

文法的二义性:如果一个文法存在某个句子对应两棵不同的语法树,则说明这个文法是二义的。

 

句型分析:是指识别输入的符号是否为某一文法的句型(或句子)的过程。

 

最左(右)推导:指对于一个推导序列中的每一直接推导,被替换的总是当前符号串中的最左(右)非终结符号。最右推导也 称为规范推导。

 

posted @ 2021-11-02 16:03  Mr_宋先生  阅读(547)  评论(0编辑  收藏  举报