要为 tao 语言设计词法分析器,首先得知道 tao 语言是一种什么样的语言。不过呢,我脑海里尚未 tao 语言具体形象。我仍是先贴一段 tao 语言的代码,大概展现下这是怎么回事吧。程序员
def say_hello_world(who) print “hello world ” + who end var name = “tao” say_hello_world name #我是注释,注释是这样写的
看起来多是这个样子。这个系列中的 tao 语言我会采起一边写编译器,一边设计的形式。细节在以后的章节会逐步补充完整。本章只是些词法分析器,所以没必要了解太多细节(也没必要设计出来)。所以,tao语言的概念也暂时止步于此不做细节上的讨论。正则表达式
OK,不过首先咱们得把词法分析器能生成的单词类型定义好了。嗯,我想一想,显然一个语言至少要这么几种类型嘛。函数
严格来讲,仅由数字、英语字母、下划线的字符串(能够以'?'、'!'为结尾,但不能以数字为开头),若是没有被关键字占用,则通通称之为标示符。其正则表达式形如:编码
^[a-zA-Z_][0-9a-zA-Z_]*[!\?]?$设计
固然,关键字的形式和标示符是同样的(至少要知足标示符的正则表达式定义)。code
而后,数据类型也要有:字符串
其中数字类型的形式和标示符的形式极为相似,不一样点在于,数字类型要求必须以数字开头(固然结尾不能够接'?'和'!')这两个符号啦。其正则表达式形如:编译器
^[0-9][0-9a-zA-Z_]*$io
如此以来数字类型就和传统意义上的数字不同了。形如"110police"也会被当作数字。此外,像3.14这种实数却不会被看成数字。嗯,这的确是问题,可是我不想在如今就解决这个问题,暂时无论啦,请先无视~~~。编译
另外一个是正则表达式的定义,tao 语言中将 ` 符号置于两端来表示正则表达式。(什么,找不到这个符号,嗯,这个符号在“1”的左边,直接按下便可打出。)为何用这个符号而不用 / 分开呢,猜一猜为何呢?嗯,真正开始编码的时候揭示答案吧。
再而后,这些对编译器意义不大,但仍是有点用处的类型:
最后的最后,还有一个类型是必须:
这个类型不对应任何程序员可输入的形式,实际上,词法分析器会在解析完全部源代码以后,自动以一个该类型的单词结尾。这个类型是专门给语法分析器(Parser)使用的。