软考-软件设计师:程序设计语言-编译过程-词法分析-文法 作者:马育民 • 2025-04-06 08:41 • 阅读:10006 # 介绍 文法,是在 **词法分析** 节点 一个形式文法是一个有序四元组 `G=(V,T,S,P)`,其中: - V:非终结符。不是语言组成部分,不是最终结果,可理解为占位符。 - T:终结符。是语言的组成部分,是最终结果。 - S:起始符。是语言的开始符号。 - P:产生式。用终结符替代非终结符的规则 # 例子 [](https://www.malaoshi.top/upload/0/0/1GWtUveotev.png) ### 分析 - a、b没有推导,所以是 `终结符 T` - S、A可以推导出其他,所以是 `非终结符 V`。推导过程也就是 `产生式 P` - S 是起始符,从 S 开始推导 - `|`代表 `或` 的意思。如:`S -> aAS|a`,表示可以推导出 `aAs` 或 `a`。**注意:** 没有先后顺序 ### 解答 [](https://www.malaoshi.top/upload/0/0/1GWtV1v01kC.png) # 题 简单算术表达式的结构可以用下面的上下文无关文法进行描述(E为开始符号),()是符合该文法的句子。 ``` E -> T|E+T T -> F|T*F F -> -F|N N→0|1|2|3|4|5|6|7|8|9 ``` A、`2--3*4` B、`2+-3*4` C、`(2+3)*4` D、`2*4-3` ## 分析 #### 选项C 有 `()`,但是在推导式中没有,所以是错误的 #### 选项A `2--3*4` 转成=> `2 - (-3)*4` 转成=> `2 + -( (-3)*4 )` 看出有些复杂,先不算 A #### 选项B `2+-3*4` 转成=> `2 + (-3) * 4` **技巧:** - 从左往右看,是 `加法` 运算,根据 `E -> E+T` 推导出 - 接下来,要将 `T` 推导出 `(-3) * 4` 具体如下: [](https://www.malaoshi.top/upload/0/0/1GWtVmIcfAJ.png) 原文出处:http://malaoshi.top/show_1GWtV26espD.html