编译原理之文法

编译原理之文法编译原理之文法

大家好,又见面了,我是你们的朋友全栈君。

文法(Grammar)

 

G={VTVNSP}

 

VT是一个非空有限的符号集合,它的每个元素称为终结符号Terminal

 

VN是一个非空有限的符号集合,它的每个元素称为非终结符号(Non-Terminal

 

SVN,称为文法G开始符号

 

P是一个非空有限集合,它的元素称为产生式

 

VTVN=∅

产生式,其形式为αβα称为产生式的左部,β称为产生式的右部,符号“→”表示“定义为”,并且αβ∈(VTVN) *αε,即αβ是由终结符和非终结符组成的符号串。

开始符S必须至少在某一产生式的左部出现一次。

另外可以对形式αβαγ的产生式缩写为αβ|γ,以方便书写。

 

解释:

(VTVN) *:也就是VTVNKleene闭包

αεα不等于空符号串

用小写字母代表终结符,如:abc……,不能被拆分

用大写字母代表非终结符,如:ASBX……,可以被拆分

    著名语言学家NoamChomsky(乔姆斯基)根据对产生式所施加的限制的不同,把文法分成四种类型,即0型、1型、2型和3型。


文法类型

产生式的限制

文法产生的语言

0型文法

αβ

其中αβ∈(VTVN) *,∣α∣≠0

0型语言

1型文法

αβ

其中αβ∈(VTVN) *,∣α∣≤∣β

1型语言,即上下文有关语言

2型文法

Aβ

其中AVNβ∈(VTVN) *

2型语言,即上下文无关语言

3型文法

A→α|αB(右线性)A→α|Bα(左线性)

其中,ABVNαVT{
ε}

3型语言,即正规语言,

又分为左线性语言和右线性语言

 

0型文法:α∈(VTVN) * 且至少含有一个非终结符,而β∈(VTVN) *

                       例:A→a,Aa→a,aA→a(左边至少有一个大写字母)


1型文法:有一特例:αε也满足1型文法。

         例:A→a,A→ab,Aa→BAc(左边至少有一个大写字母,且左边的长度小于等于右边的长度)


2型文法:每一个Aβ都有A非终结符

        例:A→a,A→ab,AB→BAc(在1型文法的前提下,左边必须都是大写字母)


3型文法:如有:A→a,A→aB,B→a,B→cB,则符合3型文法的要求。

但如果推导为:A→ab,A→aB,B→a,B→cB或推导为:A→a,A→Ba,B→a,B→cB则不符合3型方法的要求了。

例子:A→ab,A→aB,B→a,B→cB中的A→ab不符合3型文法的定义,如果把后面的ab,改成aB(即“一个非终结符+一个终结符”)就对了。

例子:A→a,A→Ba,B→a,B→cB中如果把B→cB改为B→Bc的形式就对了,因为A→α|αB(右线性)和A→α|Bα(左线性)两套规则不能同时出现在一个语法中,只能完全满足其中的一个,才能算3型文法。

 

如果所有终端结点都是与终结符关联的,每棵推导树的终端结点自左至右所构成的字符串应该是文法G的一个句型,则该字符串是文法G的一个句子,此时该推导树是完全推导树

如:文法G={a,b}{S,A},S,P,其中:SaAS|a,ASbA|SS|ba,句型aabAa相对应的构造树。

 

解释:

文法G={VTVNSP},即VT={a,b}VN={S,A}

SaAS|a,即SaASSa

ASbA|SS|ba,即ASbAASSAba

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/105720.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 1192啥意思_拓扑排序怎么排

    1192啥意思_拓扑排序怎么排由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理Mr.Z心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。于是Mr.Z下令召开 m 方会谈。每位参加会谈的代表提出了自己的意见:“我认为员工 a 的奖金应该比 b 高!”Mr.Z决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位员工奖金最少为100元,且必须是整数。输入格式第一行包含整数 n,m,分别表示公司内员工数以及参会代表数。接下来 m

    2022年8月10日
    3
  • icem网格数和节点数_icem如何查看网格数量[通俗易懂]

    icem网格数和节点数_icem如何查看网格数量[通俗易懂]>减少总块数,加速求解关键:统一索引y/j索引空间索引空间x/i结构网格的索引与合并ICEM中块的合并Autodyn中网格的合并结构网格的索引与合并索引……网格的索引合并->减少总块数,加速求解关键:统一索引y/j索引空间索引空间x/i结构网格的索引与合并ICEM中块的合并Autodyn中网格的合并结构网格的……选择…

    2022年5月25日
    112
  • iOS安全攻防(三):使用Reveal分析他人app

    iOS安全攻防(三):使用Reveal分析他人app

    2021年12月7日
    36
  • qt scrollarea怎么用_Qt开发经验

    qt scrollarea怎么用_Qt开发经验Qt ScrollArea

    2022年4月21日
    85
  • O泡果奶-APK反编译-Lua脚本

    O泡果奶-APK反编译-Lua脚本O泡果奶-APK反编译-Lua脚本反编译出的代码(有注释)–main.lua–require(“import”)import(“android.app.*”)import(“android.os.*”)import(“android.widget.*”)import(“android.view.*”)import(“android.view.View”)import(“android.content.Context”)import(“android.media.MediaPlay

    2022年9月18日
    0
  • C++类中静态变量和静态方法使用介绍

    C++类中静态变量和静态方法使用介绍刷剑指offer第64题涉及到类内静态成员与方法的知识,有点模糊,找了两篇博客整理一下。转自:https://www.cnblogs.com/sixue/p/3997324.html    最近一直看c++相关的项目,但总是会被c++类中的静态成员变量与静态成员函数的理解感觉很是模糊,不明白为什么类中要是用静态成员变量.于是在网上搜集了一些资料,自己再稍微总结下。静态成员的概…

    2022年5月27日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号