音无结弦之时,天使跃动之心。立于浮华之世,奏响天籁之音。|

次林梦叶

园龄:3年3个月粉丝:22关注:3

编译原理--文法和语言

image

summer pocket _ 羽未
将幸福装进口袋,那个夏日无比的耀眼

文法与语言的定义

文法定义:

>文法G定义为四元组(Vn,Vt,P,S),Vn为非终结符,Vt为终结符,P为规则,S为标识符(开始符)

文法G所产生所参数的语言定义为集合L(G)
文法的类型P25

句型与句子:

image
> 句型包括句子

语法树

一颗语法树对应多个推导过程
一个句型可以对应多颗语法树,可以有多个最左(右)推导
> α=>β,其中α,β均是句型,对α中最左(右)非终结符进行替换,则称这种推导为最左(右)推导。
最右推导被称为规范推导,推导所得到的句型称之为右句型或规范句型

一个语法树既可以表示句型也可以表示句子

短语

image


不妨用如下图结合定义来理解下短语:

这里的句型为(S,(a))

image

其实还是要结合短语的定义来理解,短语的定义中有个特别重要的前提(教程P31):αβγ是文法G的一个句型,然后当我们画出语法树的时候将αβγ当做叶子节点就行了,不管α,β,γ到底是否是终结字符,然后一切的推导都是以αβγ作为最终结果

如上述语法树我们根据定义模拟一遍推导:

S=>S S=+>(S,(a)) 我们称(S,(a))是句型(S,(a))的相对于非终结符S的短语
S=
>(S,S) S=+>(a) (a)是句型(S,(a))的相对于非终结符S的短语
S=>(S,(S)) S=+>a a是句型(S,(a))的相对于非终结符S的短语,由于S->a只经过了一次推导,所以也是直接短语
S=
>(S,(L)) L=+>a a是句型(S,(a))的相对于非终结符L的短语
S=>(L) L=+>S,(a) S,(a) 是句型(S,(a))的相对于非终结符L的短语
S=
>(L,(a)) L=+>S S是句型(S,(a))的相对于非终结符L的短语,由于L->S只经过了一次推导,所以也是直接短语

总的来说我们可以看到最后都是以句型中的词作为推导结束的,我们就是要在语法树上找哪些非终结符可以推到句型中的词的。

句柄:

这个概念只适合于右句型,一个右句型的直接短语被称为该句型的句柄
在树上的体现就是:树最左边的直接短语

文法的类型

一篇不错的博客
image


α->β

  • 0型文法只需要对α有要求 至少包含1个非终结符

    image
    直观感受是0型文法就是随便推,只要推导是正确的,递归可枚举集必定是一个0型文法


  • 1型文法在0型文法的基础上进一步的要求产生式的左部α中符号的个数不能多于β中符号的个数

    image
    直观感受就是在随便推的基础上,推出的式子长度不能小于原来的式子,除开始符S-> image除外


  • 2型文法就是上下文无关文法,左部α必须是一个非终结符

    image


  • 3型文法,右线性文法在2型文法的基础上继续对产生式的右部进行限制,也就是说右线性文法的右部要么是终结符号串w,要么就是在终结符右边添加一个非终结符B;左线性文法的话要么是一个终结符,要么是在终结符左边加一个非终结符在正则文法的表达式的右部最多只有一个非终结符
    image
    image

错题

image

读书随记

文法是什么?

句子:我是大学生
句子要符合规则,这种规则被称为文法 p19,20

文法上以有穷的集合刻画无穷的集合的一个工具

文法可以表示为G=(Vn,Vt,P,S)

一般还可以用

G[S]: S->0S1
S->01

的形式表示文法,而不用四元组的形式(P22)

句型上一种抽像的结构,如<句子>::=<主语><谓语><宾语>
句子就是具体的了如<句子>::=我扫地
句子中全部都是终结符,而句型比较随意,其都可以包含
当然句子也是句型 P23

L(G) 表示文法G所产生的语言定义的集合
这里 L(G)={xxx},这个xxx可以被正规式(正规表达式)或正规集代替

所谓的正规式上如同 a(b|c*)这样的形式
正规集是正规式能够产生全部符合串的集合(包括空集)P45,P25

L(G1)=L(G2)说明 文法G1和文法G2是等价的 P25

对于文法的类型,这里有个比较重要的人名 乔姆斯基,他把文法分成0,1,2,3型

  • 0型文法就是要求对于文法G【S】中的每一个产生式a->b,都有a中至少包含一个非终结符(注意:这里a,b都是代表一串符号)

  • 1型文法被称为上下文有关文法,即对于文法G[S]中的每一个产生式a->b,|a|>=|b|,除了推出空的情况外

  • 2型文法被称为上下文无关文法,即对于文法G[S]中的每一个产生式a->b,|a|=1,且a为非终结符
    a的长度为1,且为非终结符对于语法树有个十分大的好处,就是每一个节点都可以上一个词
    只要涉及到语法树,用的基本上都是上下文无关文法的产生式进行推导的(当然3型文法也有这个特点,但是3型文法又太苛刻了)

  • 3型文法被称为正规文法,即对于文法G[S]中的每一个产生式a->b,|a|=1,且a为非终结符,b的形式如 cD或c
    即:A->aB A->a B->cD
    如上为正规文法

P26

0~3型文法的条件上越来越严格的,所以如果是2型文法,那么一定是0,1型文法

对于文法G[S]一个句子如:aabbccdaa
对于给定的一个文法G[S]的产生式,根据这个产生式生成推导出aabbccdaa的语法树可能有多个,我们称这个文法是二义的
因为如果一个文法的句子有不同的语法树,我们称这个文法是二义的
否则我们称这个文法上无二义的

在推导某个句子的语法树时,根据推导的方式,有最左推导和最右推导的方式,其中最右推导被称为规范推导
我们可以想下:如果一个文法G是无二义的,那么最左推导和最右推导的语法树一定是一样的

文法不是无二义的,都可能会存在有多个最左推导和最右推导的情况。
如P28,那个例子上有多个最左推导的情况

在自底向上的一种称作“规范规约”的分析中,讲“可规约串”称作句柄。
要求句型的短语和直接短语,那么肯定短语一定是在句型中的一部分,在写这种题的时候不要忘记了,如:

文法G[E]:
E->T|E+T
T->F|T*F
F->(E)|i

让我们求句型(T*F+i)的所有直接短语和句柄

首先给出这种题目,一般文法都是无二义的,既然是无二义的那么我们就简单起见,通过最右推导得到其语法树吧

image

这个是他的语法树,然后我要求句型(T*F+i)的所有直接短语

可以看到根据短语的定义,E->(T+i),其中(,),+,i上在句型(TF+i)上的
然后T=>T
F,所以T*F上短语,而且上直接短语

同理 E->(TF+F) ,其中(,T,,F,)都是在句型上的,F=>i,所以i上直接短语

能说TF+i上直接短语吗?不能!
因为E->(E) 但是E不能直接推出T
F+i

所以全部的直接短语是T*F,i

句柄上右句型的所有直接短语中最左边的那个,也就是T*F


image

注意:如果是问短语的话,是包括整个句型的,因为S->S S-+>(SdSdS)

本文作者:次林梦叶

本文链接:https://www.cnblogs.com/cilinmengye/p/17730957.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   次林梦叶  阅读(169)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起