摘要:要为语言设计词法分析器,首先得知道语言是一种什么样的语言。,不过首先我们得把词法分析器能生成的单词类型定义好了。
要为 tao 语言设计词法分析器,首先得知道 tao 语言是一种什么样的语言。不过呢,我脑海里还没有 tao 语言具体形象。我还是先贴一段 tao 语言的代码,大概展示下这是怎么回事吧。
def say_hello_world(who) print “hello world ” + who end var name = “tao” say_hello_world name #我是注释,注释是这样写的
看起来可能是这个样子。这个系列中的 tao 语言我会采取一边写编译器,一边设计的形式。细节在之后的章节会逐步补充完整。本章只是些词法分析器,因此不必了解太多细节(也不必设计出来)。因此,tao语言的概念也暂时止步于此不作细节上的讨论。
OK,不过首先我们得把词法分析器能生成的单词类型定义好了。嗯,我想想,显然一个语言至少要这么几种类型嘛。
关键字(Keyword)
符号(Sign)
标示符(Identifier)
其中关键字和符号很好理解,标示符,则具体而言,就是用户定义的变量、函数定义中的函数名和参数名、被调用函数的函数名等等这些东西。
严格来说,仅由数字、英语字母、下划线的字符串(可以以"?"、"!"为结尾,但不能以数字为开头),如果没有被关键字占用,则统统称之为标示符。其正则表达式形如:
^[a-zA-Z_][0-9a-zA-Z_]*[!?]?$
当然,关键字的形式和标示符是一样的(至少要满足标示符的正则表达式定义)。
然后,数据类型也要有:
数字类型(Number)
字符串(String)
正则表达式(RegEx)
其中数字类型的形式和标示符的形式极为类似,不同点在于,数字类型要求必须以数字开头(当然结尾不可以接"?"和"!")这两个符号啦。其正则表达式形如:
^[0-9][0-9a-zA-Z_]*$
如此以来数字类型就和传统意义上的数字不一样了。形如"110police"也会被当做数字。此外,像3.14这种实数却不会被当作数字。嗯,这的确是问题,但是我不想在现在就解决这个问题,暂时不管啦,请先无视~~~。
另一个是正则表达式的定义,tao 语言中将 ` 符号置于两端来表示正则表达式。(什么,找不到这个符号,嗯,这个符号在“1”的左边,直接按下即可打出。)为什么用这个符号而不用 / 分开呢,猜一猜为什么呢?嗯,真正开始编码的时候揭示答案吧。
再然后,这些对编译器意义不大,但还是有点用处的类型:
注释(Annotation)
空格(Space)
回车(NewLine)
其中注释以 # 开始,单行注释。
最后的最后,还有一个类型是必须:
终止符(EndSymbol)
这个类型不对应任何程序员可输入的形式,实际上,词法分析器会在解析完所有源代码之后,自动以一个该类型的单词结尾。这个类型是专门给语法分析器(Parser)使用的。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64214.html
摘要:现在,让我们来动手写编译器的第一个个文件吧。如其名字所示,这个类实例化的对象用于表示词法分析器的产物。我希望词法分析器从源代码中提取出语素,并根据上下文推测出单词类型,从而构造出对象。只需要构造出类型即可,进一步细分将在的构造函数中进行。 现在,让我们来动手写编译器的第一个个java文件吧。本章要写的类,是Token类。如其名字所示,这个类实例化的对象用于表示词法分析器 Tokeniz...
摘要:这样的程序或称工具有很多现成的可供选择包括在平台上可用的,但既然我这个系列叫做从零开始写个编译器吧,那显然如果我用现成的工具,那是犯规行为。 Parser(语法分析器)的编写相对于 Tokenizer (词法分析器)要复杂得多,因此,在编写之前可能也会铺垫得更多一些。当然,本系列旨在写出一个编译器,所以理论方面只会简单介绍 tao 语言所涉及的部分。 之前的几章中,我纯手写了tao 语...
摘要:是的,这个系列将呈现一个完整的编译器从无到有的过程。但在写这个编译器的过程中,我可不会偷工减料,该有的一定会写上的。该语言的虚拟机将运行于之上,同时编译器将使用实现。我早有写编译器的想法之前没写过,故希望一边写编译器一边完成这个系列。 是的,这个系列将呈现一个完整的编译器从无到有的过程。当然,为了保证该系列内容的简洁(也为了降低难度),仅仅保证编译器的最低要求,即仅能用。但在写这个编译...
摘要:词法分析器本身就是一个状态机,生成这个状态机有很多种方法,而我打算采取手写的方式。状态机不断从源代码即一个字符串中读入一个一个字符,读到不同的字符将使状态机的状态从一个状态变化到另外一个状态。 词法分析器 Tokenizer 本身就是一个状态机,生成这个状态机有很多种方法,而我打算采取手写的方式。因为 tao 语言的词法还是相对比较简单的,手写不成问题。 先新建一个LexicalAna...
摘要:自然,我们还是先从语言的编译器下手吧。在动手写编译器之前,得容我将编译器的结构进行进一步的划分。这些将被语法分析器接收并进行进一步处理。由于本系列将着重于写出编译器,必要的理论和概念还是会交代的。从零开始写个编译器吧编译器的结构的博客 自然,我们还是先从 tao 语言的编译器下手吧。在动手写编译器之前,得容我将编译器的结构进行进一步的划分。编译器可视为一个黑盒,从其一端输入源代码,另一...
阅读 2898·2023-04-26 02:22
阅读 2228·2021-11-17 09:33
阅读 3106·2021-09-22 16:06
阅读 1010·2021-09-22 15:54
阅读 3480·2019-08-29 13:44
阅读 1857·2019-08-29 12:37
阅读 1266·2019-08-26 14:04
阅读 1863·2019-08-26 11:57