热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

编译原理-第2部分形式语言导论-第二节文法和语言-第一小节文法和语言的概念(文法)

1引言上一讲述的是“语言”的概念,这一篇和大家分享的是“文法”的概念。分享完文法的概念之后,会给大家三个例子,帮助我们来更好地理解“文法”这个抽象的概念。2文法文法通常
1 引言

    上一讲述的是“语言”的概念,这一篇和大家分享的是“文法”的概念。分享完文法的概念之后,会给大家三个例子,帮助我们来更好地理解“文法”这个抽象的概念。

2 文法

 文法通常表示成四元组G=(,S,ξ),其中:

(1) 为终结符号集,这是一个非空有限集,它的每个元素称为终结符号;

(2) 为非终结符集,它也是一个非空有限集,其每个元素称为非终结符号,且有=Φ;

(3) S为一文法开始符,是一个特殊的非终结符号,即S∈

(4) ξ是产生式的非空有限集,其中每个产生式(或称规则)是一序偶(α,β),通常写作

                      α→β或α::=β

    读作“α是β”或“α定义为β”。在此,α为产生式的左部,而β为产生式的右部,α、β是由终结符和非终结符组成的符号串,α∈()+且至少有一个非终结符,而β∈()*。

    终结符号是指语言不可再分的基本符号,通常是一个语言的字母表;终结符代表了语法的最小元素,是一种个体记号。
非终结符号也称语法变量,它代表语法实体或语法范畴;非终结符代表一个一定的语法概念,因此,一个非终结符是一个类、一个集合。

     例如,在程序语言中,可以把变量、常数、“+”、“*”等看作是终结符,而像“算术表达式”这个非终结符则代表着一定算术式组成的类,如i*(i+i)、i+i+i等;也即每个非终结符代表着由一些终结符和非终结符且满足一定规则的符号串组成的集合。

    文法开始符号是一个特殊的非终结符,它代表文法所定义的语言中我们最终感兴趣的语法实体,即语言的目标,而其它语法实体只是构造语言目标的中间变量;如表达式文法的语言目标是表达式,而程序语言的目标通常为程序。
产生式(也称产生规则或规则)是定义语法实体的一种书写规则。
一个语法实体的相关规则可能不止一个。
例如,有:
P→α1
P→α2
      …

P→αn

为书写方便,可将这些有相同左部的产生式合并为一个,即缩写成

P→α1∣α2∣…∣αn

    其中,每个αi(i=1,2,…,n)称为P的一个候选式,直竖“∣”读为“或”,它与“→”一样是用来描述文法的元语言符号(即不属于Σ的字符)

    由文法定义可知,文法是对语言结构的定义和描述,文法四大要素中关键是规则的集合。

3 例题

3.1 例题一

    设字母表∑={a, b},试设计一个文法,描述语言 L= { a^2n, b^2n | n≥1 }。

    分析  设计一个文法来描述一个语言, 关键是设计一组规则生成语言中的符号串。因此,为设计该语言文法,必须分析这个语言是由怎样一些符号串组成的,即首先分析语言中串的结构特征:

当n=1   L={aa, bb}

当n=2   L={aaaa, bbbb}

当n=3  L={aaaaaa, bbbbbb}

……

L={aa, bb, aaaa, bbbb, aaaaaa, bbbbbb, … …} 

语言L是由偶数个a,偶数个b这样的符号串组成的集合。


3.2 例题二

     试设计一个表示所有标识符的文法。

    题意是用文法定义标识符,必须确定文法中的规则。为了设计出一组规则,首先应搞清楚语言中标识符的结构特征。我们认为标识符是以字母开头,后面加上字母或者数字。用I代表标识符;L代表字母;D代表数字; 则定义标识符的文法为:


3.3 例题三

    写一文法,使其语言是奇数集合,但不允许出现以0打头的奇数。

    根据题意,我们可以将奇数划分为如图2–1所示的三个部分,即最高位允许出现1~9,用非终结符B表示;中间部分可以出现任意多位数字0~9,每一位用非终结符D表示;最低位只允许出现1、3、5、7、9等奇数,用A表示。(如下图所示)


由于中间部分可出现任意位,所以另引入了一个非终结符M,它包括最高位和中间位部分。
            假定开始符为N,则可得到文法G[N]为:
           G=({0,1,…,9},{N,A,M,B,D},N,ξ)
ξ:N→A∣MA /*一位数字│多位数字*/
     M→B∣MD /*仅两位数字(无中间位)│多于两位数字*/
     A→1∣3∣5∣7∣9
     B→1∣2∣3∣4∣5∣6∣7∣8∣9

     D→0∣B

4 结束语

    又是一次分享,又是一次收获,这三个例子,还是要认真地去理解,有助于加深我们对“文法”的认识。

    分享和帮助是人生一大乐事,希望可以帮助您。本人才疏学浅,如果有不当之处,还请批评指正。同时欢迎大家评论、点赞及转发!


推荐阅读
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • CMake跨平台开发实践
    本文介绍如何使用CMake支持不同平台的代码编译。通过一个简单的示例,我们将展示如何编写CMakeLists.txt以适应Linux和Windows平台,并实现跨平台的函数调用。 ... [详细]
  • 解读MySQL查询执行计划的详细指南
    本文旨在帮助开发者和数据库管理员深入了解如何解读MySQL查询执行计划。通过详细的解析,您将掌握优化查询性能的关键技巧,了解各种访问类型和额外信息的含义。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • Google最新推出的嵌入AI技术的便携式相机Clips现已上架,旨在通过人工智能技术自动捕捉用户生活中值得纪念的时刻,帮助人们减少照片数量过多的问题。 ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 本文深入探讨了 Java 编程语言的基础,特别是其跨平台特性和 JVM 的工作原理。通过介绍 Java 的发展历史和生态系统,帮助初学者理解如何编写并运行第一个 Java 程序。 ... [详细]
  • C++构造函数与初始化列表详解
    本文深入探讨了C++中构造函数的初始化列表,包括赋值与初始化的区别、初始化列表的使用规则、静态成员初始化等内容。通过实例和调试证明,详细解释了初始化列表在对象创建时的重要性。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • libsodium 1.0.15 发布:引入重大不兼容更新
    最新发布的 libsodium 1.0.15 版本带来了若干不兼容的变更,其中包括默认密码散列算法的更改和其他重要调整。 ... [详细]
  • 本文介绍如何在Java项目中使用Log4j库进行日志记录。我们将详细说明Log4j库的引入、配置及简单应用,帮助开发者快速上手。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
author-avatar
tigerweilong
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有