热门标签 | 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 结束语

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

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


推荐阅读
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • OBS (Open Broadcaster Software) 架构解析
    本文介绍 OBS(Open Broadcaster Software),一款专为直播设计的开源软件。文章将详细探讨其技术架构、核心组件及其开发环境要求。 ... [详细]
  • 优秀的产品不仅具备强大的功能,还在细节上做到极致,这些细微之处往往是提升用户体验、增强用户黏性和市场竞争力的关键。微交互作为其中的重要组成部分,通过简洁而有效的设计,为用户提供即时反馈,增强互动体验。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • XWiki 数据模型开发指南
    本文档不仅介绍XWiki作为一个增强版的wiki引擎,还深入探讨了其数据模型,该模型可在用户界面层面被充分利用。借助其强大的脚本能力,XWiki的数据模型支持从简单的应用到复杂的系统构建,几乎无需直接接触XWiki的核心组件。 ... [详细]
  • 深入解析Java异常处理机制:异常分类与检查
    本文旨在全面介绍Java中的异常分类及其检查机制,帮助开发者更好地理解和应用异常处理策略。后续将深入探讨异常处理的相关源码。 ... [详细]
  • 如何在Linux中实现字符设备控制
    本文详细探讨了在Linux环境下控制字符设备的方法,包括蜂鸣器和模数转换器(ADC)的实际操作案例。对于开发者来说,了解这些基础知识对于嵌入式系统的开发尤为重要。 ... [详细]
  • Java中String类为何设计为final?其不可变性与其他包装类的特性
    探讨Java中String类设计为final的原因及其不可变性,同时分析其他基本数据类型包装类及枚举类型的不可变性。 ... [详细]
  • 在学习Python的map函数过程中,由于误将一个字典类型的变量命名为map,导致程序运行时报出了 'dict' object is not callable 的错误。 ... [详细]
  • 本文详细解析了Java中instanceof关键字的使用方法,包括其基本语法、应用场景及特殊情况处理,帮助开发者更好地理解和运用这一重要的类型判断工具。 ... [详细]
  • TWEN-ASR 语音识别入门:运行首个程序
    本文详细介绍了如何使用TWEN-ASR ONE开发板运行第一个语音识别程序,包括开发环境搭建、代码编写、下载和调试等步骤。 ... [详细]
  • 在使用MFC进行项目开发时,可能会遇到编译错误C2244,提示函数定义与现有声明不匹配。本文将详细介绍这一错误的原因及解决方案。 ... [详细]
  • 本文详细介绍了在计算机上为文件夹和磁盘设置密码的方法,包括不同的加密级别及其安全性和恢复方法。 ... [详细]
  • 大数据基础:JavaSE_day06 ... [详细]
  • 本文深入探讨Java编程语言的关键特性,包括但不限于其简洁性、强大的面向对象能力、跨平台兼容性、安全机制、高效性能及多线程支持等方面。文章旨在为开发者提供全面理解Java特性的指导。 ... [详细]
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社区 版权所有