资讯专栏INFORMATION COLUMN

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

JayChen / 2505人阅读

摘要:考虑一个非终结符,如果对于另一个符号,存在如下产生式。则对于而言,它可以表示非终结符重复多次的各种形式。以上三个式子展现了将任意非终结符关于重复次数的多种形式。

式子中的符号,我还允许使用数量词来修饰。
考虑一个非终结符 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? 一定可以导出 ε。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65502.html

相关文章

  • 从零开始写个译器系列

    摘要:是的,这个系列将呈现一个完整的编译器从无到有的过程。但在写这个编译器的过程中,我可不会偷工减料,该有的一定会写上的。该语言的虚拟机将运行于之上,同时编译器将使用实现。我早有写编译器的想法之前没写过,故希望一边写编译器一边完成这个系列。 是的,这个系列将呈现一个完整的编译器从无到有的过程。当然,为了保证该系列内容的简洁(也为了降低难度),仅仅保证编译器的最低要求,即仅能用。但在写这个编译...

    genedna 评论0 收藏0
  • 从零开始写个译器 - 开始写词法分析器(3)

    摘要:在之前的章节第章从零开始写个编译器吧开始写词法分析器中我有说,我将函数设计成主动调用的形式,而则是被动调用的形式。接下来本系列将进入编写语法分析器的阶段,不过在此之前,我将抽出一点时间介绍一下语言本身。 上周周末旅游去了,就没更新了,虽然回到海拔0m的地区,不过目前似乎还在缺氧,所以本次就少更点吧。 这章将结束词法分析的部分。 在之前的章节(第7章从零开始写个编译器吧 - 开始写词...

    Barrior 评论0 收藏0
  • 从零开始写个译器 - tao语言的词法分析器(Tokenizer)的类型定义

    摘要:要为语言设计词法分析器,首先得知道语言是一种什么样的语言。,不过首先我们得把词法分析器能生成的单词类型定义好了。 要为 tao 语言设计词法分析器,首先得知道 tao 语言是一种什么样的语言。不过呢,我脑海里还没有 tao 语言具体形象。我还是先贴一段 tao 语言的代码,大概展示下这是怎么回事吧。 def say_hello_world(who) print hello ...

    qpal 评论0 收藏0
  • 从零开始写个译器 - 符号分析,编写 SignParser.java 文件

    摘要:即创建一个文件,并写下如下内容。然后以此缓存一个字符串,然后,通过调用来将这个字符串分割成一个一个运算符,并生成。语言中根据运算符长度分开储存的。具体来说,如果运算符对应的字符串最短的是,最长的是。 上一章留下的那个大大的 TODO 表明,似乎还有什么东西没写完。没错,所以这一章我们来写 Sign 状态下的代码。 所谓 Sign 状态,即是用来处理和生成 Sign 类型的 Token...

    joyqi 评论0 收藏0
  • 从零开始写个译器 - 文法简介

    摘要:而,称之为非终结符。而这个展开方案中对各个非终结符产生式的选择过程,即是对源代码中每一个部分的定性过程。这个过程让能够理解源代码各个部分表示的含义,并以此生成对应的语法树。 我需要定义出 tao 语言的细节,在此,需要引出文法这一概念。所谓文法,即是用于描述语言的一种工具。 例如,一个赋值语句可能写成如下形式: variable = 1 + 3 如何充分定义这个赋值语句的形...

    stormzhang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<