编译原理学习(二)--终结符和非终结符

本文详细解释了形式语言中的终结符与非终结符的概念,终结符是基本符号不可再分解,而非终结符则可以在形式文法中被替换。通过实例说明了两者在上下文无关文法中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于书中没有对终结符和非终结符给出明确的定义,导致看的昏昏沉沉,因此专门搜索资料理清楚它们的含义。

1.终结符

终结符是一个形式语言的基本符号。就是说,它们能在一个形式语法的推导规则的输入或输出字符串存在,而且它们不能被分解成更小的单位。确切地说,一个语法的规则不能改变终结符。例如说,下面的语法有两个规则:

  1. x -> xa
  2. x -> ax

在这种语法之中,a是一个终结符,因为没有规则可以把a变成别的符号。不过,有两个规则可以把x变成别的符号,所以x是非终结符。一个形式语法所推导的形式语言必须完全由终结符构成。

2.非终结符

非终结符是可以被取代的符号。一个形式文法中必须有一个起始符号;这个起始符号属于非终结符的集合。

在上下文无关文法中,每个推导规则的左边只能有一个非终结符而不能有两个以上的非终结符或终结符。并非所有的语言都可以被上下文无关文法产生。

在计算机科学中,若一个形式文法 G = (N, Σ, P, S) 的产生式规则都取如下的形式:V -> w,则称之为上下文无关的,其中 V∈N ,w∈(N∪Σ)* 。上下文无关文法取名为“上下文无关”的原因就是因为字符 V 总可以被字串 w 自由替换,而无需考虑字符 V 出现的上下文。一个形式语言是上下文无关的,如果它是由上下文无关文法生成的

 

### 编译原理终结符非终结符的概念 在编译原理领域内,文法由一系列符号及其组合规则构成。这些符号分为两类:终结符非终结符。 #### 终结符的特点 终结符代表的是最基础、不可再分割的语言单位[^1]。这类符号通常对应于编程语言中的具体字符或词素,比如数字`1`, `2`, `3`... 或者运算符`+`, `-`. 它们不再进一步展开成其他形式,在解析过程中一旦遇到即视为定型不变的部分。 #### 非终结符的作用 相比之下,非终结符则指那些能够被替换为更详细的结构描述的抽象标记[^3]。它们充当着一种占位角色,用于表达尚未最终确定的具体成分;例如 `<整数>` 可能会被解释为任意合法的整数值序列。通过定义一组特定的转换规则——称为产生式——可以从初始状态逐步演变为完整的语句模式。 #### 区别与联系 两者之间存在严格的界限划分,彼此间不会重叠交叉[^2]。这意味着每一个给定时刻下的输入字符串仅包含有固定形态的终结符或是等待细化处理的非终结符之一种情况。这种区分有助于构建清晰有序的形式化体系,使得计算机程序设计语言得以精确无误地被机器理解执行。 ```python # Python示例展示如何利用终结符非终结符进行简单算术表达式的解析 def parse_expression(expression): tokens = expression.split() def evaluate(): value = None while tokens: token = tokens.pop(0) if token.isdigit(): # 如果是数字(终结符) yield int(token) elif token in ('+', '-'): # 运算符也是终结符的一种特殊情形 operator = token operand1 = next(evaluate()) operand2 = next(evaluate()) if operator == '+': yield (operand1 + operand2) elif operator == '-': yield (operand1 - operand2) else: # 假设这里遇到了像<expression>这样的非终结符标签 for result in evaluate(): yield result return list(evaluate())[0] print(parse_expression('3 + 4')) # 输出7 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值