编译原理--文法定义(哈工大)
文法的定义讲解整理一、文法引入自然语言下面我们来学习文法的定义。什么是文法我们先从一个自然语言的例子讲起。这是一个简化版本的用来描述英语句子构成规则的文法。从这个文法中我们可以看出一个句子是由一个名词短语加上一个动词短语构成的。那么一个名词短语可以是由一个形容词加一个名词短语构成。还可以由一个名词构成。一个动词短语是由一个动词加上一个名词短语构成。形容词可以是 little名词可以是 boy 或者 apple动词可以是 eat。二、文法核心组成要素的提取从这个例子中我们可以提取出一些文法的组成要素。在这个文法中出现的符号可以分为两类这些用尖括号括起来的部分称为是语法成分而未用尖括号括起来的部分表示语言的基本符号。因为这个文法是用来描述句子的构成规则的那么句子的基本符号就是单词。如果一个文法是用来描述单词的构成规则的话那么这个文法的基本符号就是字母。三、文法的形式化定义四元组那么根据这个例子我们可以给出文法的形式化定义。文法我们用大写字母 G 来表示。我们把一个文法 G 定义成一个四元组。这里的这个 VT。VT 是终结符集合V 表示向量 vectorT 表示终结符 terminal symbol。那么什么是终结符呢终结符就是文法所定义的语言的基本符号。例如在刚才的这个例子中这个文法是用来描述句子的组成规则的。那么句子的基本符号是单词因此这些单词构成了这个文法的终结符集。终结符有时候也称为 token。这里的 VN 是非终结符集合非终结符是用来表示语法成分的符号。例如刚才这个文法中用尖括号括起来的这些符号。由于可以从它们进一步推导出其他的语法成分因此它们称为是非终结符。非终结符有时也称为是语法变量。这里我们需要注意一下终结符集合和非终结符集合它们是不相交的。终结符和非终结符统称为文法符号。因此VT 并上 VN 表示的是文法符号集。文法中的这个 P表示的是产生式的集合。产生式描述了将终结符和非终结符组合成串的方法。简而言之。产生式就是用来产生串的式子。产生式的一般形式是阿尔法α加一个箭头→加上一个贝塔β读作阿尔法α定义为贝塔β。从这两个式子我们可以看出阿尔法α和贝塔β表示的是文法符号串。因为这个 VT 是终结符集合它是一个字母表VN 是非终结符集合它也是一个字母表。那么这两个字母表的并集还是一个字母表。我们前面讲过。字母表的闭包表示的是这个字母表上的符号串构成的集合。因此阿尔法α和贝塔β都是文法符号串。这里我们要求阿尔法α中至少要包含一个非终结符。阿尔法α也称为产生式的头或者左部贝塔β称为产生式的体或者右部。例如在刚才的这个文法中的每一条规则都是一个产生式。文法中的 S 表示的是文法的开始符号。S 是一个特殊的非终结符它表示的是该文法中最大的语法成分。例如在刚才的这个例子中这个文法是用来描述句子的构成规则那么句子就是这个文法中最大的语法成分。因此这个就是这个文法的开始符号。四、文法实例算术表达式文法下面我们来看一个文法的例子。这是一个简化版本的用来表示算术表达式的文法。在这个文法中终结符集合中包括了以下几个终结符分别是 ID也就是标识符加号。乘号、左括号和右括号这些都是最终出现在句子中的单词。因此它们构成了这个文法的终结符集合。这个文法的非终结符集合中只有一个非终结符。是 EE 表示的是表达式Expression。那么我们来看一下这个文法它的产生式集合有 4 个产生式分别是E 定义为 EE。E 定义为 E 乘 EE 定义为括号 EE 定义为 ID。由于这是一个用来描述表达式的文法因此表达式是这个文法最大的语法成分那么E 就是这个文法的开始符号。而且这个文法中也没有其他的非终结符。我们这里约定在不引起歧义的前提下可以只写文法的产生式。例如这个文法我们可以简写为这种形式就是只把它的产生式列出来就可以表示这个文法。五、产生式的简写规则下面我们来看一下产生式的简写。对一组有相同左部的阿尔法产生式阿尔法α定义为贝塔一阿尔法α定义为贝塔二一直到阿尔法α定义为贝塔 N。可以简记为阿尔法α定义为贝塔一竖线、贝塔二竖线一直到竖线贝塔 N。读作阿尔法定义为贝塔一或者贝塔二。或者一直到贝塔 N。那么贝塔 1 到贝塔 N称为是阿尔法的候选式。例如对于这些 E 产生式我们就可以把它简写成E 定义为 EE 或 E×E 或括号 E或 id。六、文法符号的使用通用约定为了避免总是声明哪些符号是终结符哪些符号是非终结符。这里我们对符号的使用做一些约定。我们约定下述符号是终结符。字母表中排在前面的小写字母比如说 a b c 表示的是终结符。另外运算符、标点符号和数字都是终结符。粗体的字符串比如说 id if 等等它们也是终结符。我们约定下述符号是非终结符。字母表中排在前面的大写字母有大写的 A、B、C它们表示的是非终结符。另外字母 S 通常用来表示文法的开始符号因此它也是一个非终结符。小写斜体的名字比如说 E S P R 用来表示表达式 Expression S T M T 用来表示句子 Statement。那么他们这些小写的斜体名字都表示非终结符除了字母表中排在前面的大写字母以外用来代表程序构造的一些大写字母。比如说 E、T、F 等等也是非终结符。这里E 表示的是表达式expression。T 表示的是项term。F 表示的是因子factor。我们约定字母表中排在后面的大写字母比如说大写的 X、Y、Z它表示的是文法符号。也就是说它既可以表示终结符也可以表示非终结符。字母表中排在后面的小写字母主要是 u v w x y z 它们表示的是终结符号串。既然是串就有可能是空串因此这里包括空串。小写的希腊字母比如说阿尔法、贝塔、伽马等等它们表示的是文法符号串。既然是文法符号串那么也包括空串。除非特别说明第一个产生式的左部就是文法的开始符号。我们来总结一下字母表中排在前面的小写字母用来表示终结符字母表中排在前面的大写字母用来表示非终结符。字母表中排在后面的大写字母用来表示文法符号文法符号既可以是终结符也可以是非终结符。而字母表中排在后面的小写字母用来表示终结符号串。而小写的希腊字母用来表示文法符号串。

相关新闻

Win11临时文件清理实战

Win11临时文件清理实战

临时文件清理的必要性Windows 11系统运行过程中会产生大量临时文件,包括缓存、日志、更新残留等,长期积累会占用磁盘空间,影响系统性能。定期清理可释放存储空间,提升运行效率,减少潜在的系统错误。识别临时文件类型及…

2026/7/4 20:59:32 阅读更多 →
性能报告可视化:PDF生成与解读的专业实践

性能报告可视化:PDF生成与解读的专业实践

一、性能报告的核心价值与可视化挑战 在持续交付体系中,性能测试报告是决策的关键依据。但传统报告存在三大痛点: 数据过载 - JMeter等工具生成的原始数据报表包含数万行日志 可读性差 - 非技术管理者难以理解TPS、百分位延迟等专业指标 协作低效 - E…

2026/7/4 21:01:53 阅读更多 →
React 零散知识记录

React 零散知识记录

样式隔离 在vue中可以使用scoped属性实现样式隔离 <style scoped> </style>但是在React 中如何实现呢&#xff0c;可以使用CSS Modules CSS Modules 是 React 生态中最主流的样式隔离方案&#xff0c;它会自动将类名编译为唯一哈希值&#xff0c;从根本上避免冲突。…

2026/5/17 9:28:08 阅读更多 →

最新新闻

智能绕过限制:永久免费使用Cursor AI编程助手的完整方案

智能绕过限制:永久免费使用Cursor AI编程助手的完整方案

智能绕过限制&#xff1a;永久免费使用Cursor AI编程助手的完整方案 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your t…

2026/7/4 21:01:50 阅读更多 →
毕设分享 深度学习yolo藻类细胞检测识别(科研辅助系统)(源码+论文)

毕设分享 深度学习yolo藻类细胞检测识别(科研辅助系统)(源码+论文)

&#x1f446;&#x1f446; 完整项目获取方式&#x1f446;&#x1f446;完整项目获取方式&#x1f446;&#x1f446;完整项目获取方式&#x1f446;&#x1f446;完整项目获取方式&#x1f446;&#x1f446; 文章目录 &#x1f446;&#x1f446; 完整项目获取方式&#x1…

2026/7/4 21:01:50 阅读更多 →
Blender高效工作流终极指南:从插件到渲染的全方位专业技巧

Blender高效工作流终极指南:从插件到渲染的全方位专业技巧

Blender高效工作流终极指南&#xff1a;从插件到渲染的全方位专业技巧 【免费下载链接】awesome-blender &#x1fa90; A curated list of awesome Blender addons, tools, tutorials; and 3D resources for everyone. 项目地址: https://gitcode.com/GitHub_Trending/aw/aw…

2026/7/4 20:59:49 阅读更多 →
Windows系统优化与自动化部署:WinUtil工具箱完整指南

Windows系统优化与自动化部署:WinUtil工具箱完整指南

Windows系统优化与自动化部署&#xff1a;WinUtil工具箱完整指南 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 面对Windows系统臃肿、软件安…

2026/7/4 20:57:48 阅读更多 →
高效批量下载E-Hentai图库的完整指南

高效批量下载E-Hentai图库的完整指南

高效批量下载E-Hentai图库的完整指南 你是否也曾遇到这样的困扰&#xff1a;在浏览E-Hentai图库时&#xff0c;面对成百上千张精美图片却只能一张张手动保存&#xff1f;重复的点击操作不仅浪费时间&#xff0c;还容易遗漏重要内容。现在&#xff0c;有一款专为解决这个问题设计…

2026/7/4 20:53:46 阅读更多 →
宝塔部署的前后端项目从IP访问改成自定义域名访问

宝塔部署的前后端项目从IP访问改成自定义域名访问

首先去给域名添加解析 因为我们是部署在服务器上&#xff0c;以IP的形式去访问的&#xff0c;所以 添加的类型是A 主机记录就是你想要访问的二级域名的头部 比如你买了bbb.com&#xff0c;这个是主域名&#xff08;也叫一级域名&#xff09;&#xff0c;然后你想要以aaa.bbb…

2026/7/4 20:53:46 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布&#xff0c;这是一个关键的安全修复版本&#xff0c;修复了多个方面的问题&#xff0c;还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出&#xff0c;mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南&#xff1a;使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL&#xff08;Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器&#xff0c;与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻