从零开始写个编译器吧 - 数量词符号

本文详细解释了如何使用数量词符号来描述非终结符A在重复次数上的不同形式,包括A*(重复0、1次或多次)、A+(重复1次或多次)和A?(出现0次或1次)。通过引入这些语法概念,简化了构建解析器的工作,并提供了在程序中表示空值(ε)的便捷方法。

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

式子中的符号,我还允许使用数量词来修饰。
考虑一个非终结符 A,如果对于另一个符号 α,存在如下产生式。

α → αA | ε

则对于 α 而言,它可以表示非终结符 A 重复 0 、1、多次的各种形式。

现在稍稍改变这个式子,使之变成:

α → αA | A

这时,α 不再可能产生空,此时它只能表示非终结符 A 重复 1次或多次。
当然还有这个式子。

α → A | ε

这个α 表示 A 出现 0 次 或 1 次。

以上三个式子展现了将任意非终结符 A 关于重复次数的多种形式。这些形式很有用,至少对于我写 Parser 很有用。因此,可以使用数量词符号来描述。

  • A* (重复 0、1 次或多次)

  • A+ (重复 1 次或多次)

  • A? (出现 0 次或 1 次)

至此,我们已经得到了写一个 Parser 所需的所有理论工具了。但是,等等,其实我们还可以深入的探讨一下某些特别的东西。

我在上一章提及,对于每一个非终结符而言,它是否能导出 ε 是必须被判断清楚的。特别的,当然某个非终结符 A 可以导出 ε 时,我可以发现有如下等式。

A = A?
A+ = A*

严格意义上说,等号左右的式子还有是有区别的,他们虽然展开的最终结果完全相同,但展开的形式却有所差别。但对于我而言,我只关心结果,我将它们视作相等一点都不影响我的 Parser 正常运行。

这两个等式令我写程序更加方便,试想我该在程序中如何表现 ε ?我只需写一个 A? 就行了,因为 A? 一定可以导出 ε。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值