news 2026/6/11 10:32:52

【程序语言与编译】文法定义(终结符/非终结符/产生式)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【程序语言与编译】文法定义(终结符/非终结符/产生式)

适合读者:软考中级备考同学
阅读时间:3分钟
内容:文法的基本概念、终结符与非终结符、产生式、推导与归约、例题


1. 什么是文法?

文法是形式语言理论的核心概念,用于精确描述程序设计语言的语法规则。一个文法定义了一门语言中哪些符号串是合法的句子。编译程序在语法分析阶段会根据文法判断源程序是否合乎语法规则。

软考中常考查文法的基本组成(终结符、非终结符、产生式)以及文法的分类。


2. 文法的形式定义

文法GGG是一个四元组:

G=(VT,VN,P,S)G = (V_T, V_N, P, S)G=(VT,VN,P,S)

其中:

  • VTV_TVT终结符集合(Terminal Symbols)
  • VNV_NVN非终结符集合(Non-terminal Symbols)
  • PPP产生式集合(Production Rules)
  • SSS开始符号(Start Symbol),S∈VNS \in V_NSVN

3. 终结符(Terminal)

定义:文法中不能再被替换的基本符号,是语言中实际出现的字符或单词。

特点

  • 终结符是语言的字母表中的元素
  • 它们出现在最终生成的句子中
  • 没有产生式可以进一步展开终结符

示例

  • 在算术表达式文法中,+,-,*,/,(,), 数字0~9是终结符
  • 在程序语言文法中,关键字if,else,while,运算符=,==,标识符等是终结符

通常表示:用小写字母、数字或特定符号表示(如a,b,+,id)。


4. 非终结符(Non-terminal)

定义:可以被进一步展开的语法变量,用于表示语法结构。

特点

  • 非终结符不出现在最终生成的句子中(在推导过程中会被终结符序列替代)
  • 每个非终结符对应一个语法成分(如:表达式、语句、程序块)

示例

  • <表达式><赋值语句><循环>等是非终结符
  • 通常用尖括号或大写字母表示(如E,T,F,<stmt>

开始符号SSS是一个特殊的非终结符,代表整个语法成分的起点。


5. 产生式(Production Rule)

定义:描述非终结符如何展开的规则,形式为:

α→β\alpha \rightarrow \betaαβ

其中α\alphaα(左部)是至少包含一个非终结符的符号串,β\betaβ(右部)是由终结符和非终结符组成的符号串(可以为空串ε\varepsilonε)。

含义:左部的符号可以被右部的符号串替换。

示例

E → E + T E → T T → T * F T → F F → ( E ) F → id

这里的箭头表示“定义为”或“可替换为”。


6. 推导与归约

  • 推导:从开始符号出发,反复使用产生式替换非终结符,最终得到一个全部由终结符组成的串,称为该文法的一个句子
  • 最左推导:每次都替换最左边的非终结符。
  • 最右推导(规范推导):每次都替换最右边的非终结符。
  • 归约:推导的逆过程,将终结符串逐步替换为非终结符,最终得到开始符号。

7. 完整示例

文法(简单算术表达式):

S → E E → E + T | T T → T * F | F F → ( E ) | id
  • VT={+,∗,(,),id}V_T = \{+, *, (, ), id\}VT={+,,(,),id}id代表标识符,如变量名)
  • VN={S,E,T,F}V_N = \{S, E, T, F\}VN={S,E,T,F}
  • PPP为上述产生式
  • SSS为开始符号

推导示例:推导句子id + id * id的最左推导过程:

S ⇒ E ⇒ E + T ⇒ T + T ⇒ F + T ⇒ id + T ⇒ id + T * F ⇒ id + F * F ⇒ id + id * F ⇒ id + id * id

8. 文法的分类(乔姆斯基体系)

类型名称产生式形式对应自动机
0型短语结构文法α→β\alpha \rightarrow \betaαβ(无限制)图灵机
1型上下文有关文法αAβ→αγβ\alpha A \beta \rightarrow \alpha \gamma \betaαAβαγβγ≠ε\gamma \neq \varepsilonγ=ε线性有界自动机
2型上下文无关文法A→γA \rightarrow \gammaAγAAA为单个非终结符)下推自动机
3型正则文法A→aBA \rightarrow aBAaBA→aA \rightarrow aAa有限自动机

软考主要考查2型(上下文无关文法),因为它足够描述多数程序设计语言的语法结构。


9. 经典例题

题目1:给定文法GGG的产生式如下:

S → aB | bA A → aS | bAA | a B → bS | aBB | b

下列符号串中,属于该文法语言的是( )。
A. aaabb
B. ab
C. abab
D. ba

解析:需要尝试推导。该文法表示一个关于aaabbb个数相等的语言。选项 Dba可通过S → bA → ba推导得到(A→aA \rightarrow aAa)。其他选项无法推导。
答案:D


题目2:在文法中,不能出现在最终句子中的符号是( )。
A. 终结符
B. 非终结符
C. 运算符
D. 标识符

答案:B


题目3(判断):一个文法的开始符号必须是终结符。( )
答案:错误(开始符号是非终结符)


10. 记忆口诀

终结符出现最终句,非终结符可继续换。
产生式左边变右边,推导归约来检验。


11. 给备考同学的一句话

文法定义是编译原理的基础,软考中常以选择题形式考查:

  • 区分终结符和非终结符(看是否能被展开)
  • 产生式的形式(左部至少一个非终结符)
  • 最左推导/最右推导的过程理解

记住:终结符是“不能再拆”的单词,非终结符是“语法变量”。掌握这个核心区别,相关题目即可得分。


🔔本专栏日更2篇,点击头像 → 专栏《软考中级高频考点》订阅

#软考中级 #软件设计师 #文法 #终结符 #非终结符 #产生式 #编译原理

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 10:28:00

第36章:Generation 源码:从 generate 到下一个 Token

1 项目背景 业务场景 客服回复生成系统上线后,产品经理要求新增"敏感词过滤"功能——生成的回复中绝对不能出现"假一赔十"、“绝对安全”、"包治百病"等承诺性词汇。小陈尝试在 prompt 中加入"禁止使用以下词汇"的指令,但模型还是…

作者头像 李华
网站建设 2026/6/11 10:24:52

用普通游戏手柄实时操控MATLAB三维视图和模拟云台

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;直接运行Untitled.m就能让USB游戏手柄在MATLAB里干活&#xff1a;自动识别设备&#xff0c;持续读取摇杆X/Y轴偏移量和按钮状态&#xff0c;把操作信号实时转成图形视角调整&#xff08;方位角/仰角&#xff09…

作者头像 李华
网站建设 2026/6/11 10:22:03

手把手教你用MAX30102和OLED做一个桌面心率血氧监测仪(附STM32完整工程)

从零打造智能心率血氧监测仪&#xff1a;MAX30102与STM32实战指南在健康监测设备日益普及的今天&#xff0c;能够自主搭建一个精准的心率血氧监测系统不仅是一项有趣的电子项目&#xff0c;更是掌握生物信号处理技术的绝佳途径。本文将带你完整实现基于MAX30102传感器和STM32的…

作者头像 李华
网站建设 2026/6/11 10:18:10

微信客户端远程控制工具包:MQTT桥接+本地部署+云微信联动

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;一套开箱即用的微信远程控制解决方案&#xff0c;通过MQTT协议实现外部系统与微信客户端的双向通信。支持发送消息、接收事件&#xff08;如文本、图片、链接&#xff09;、响应用户交互等核心能力。内置mqtt-g…

作者头像 李华