从零开始写个编译器吧 - tao语言的词法分析器(Tokenizer)的类型定义

要为 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_]*[!\?]?$设计

固然,关键字的形式和标示符是同样的(至少要知足标示符的正则表达式定义)。code

而后,数据类型也要有:字符串

  • 数字类型(Number)
  • 字符串(String)
  • 正则表达式(RegEx)

其中数字类型的形式和标示符的形式极为相似,不一样点在于,数字类型要求必须以数字开头(固然结尾不能够接'?'和'!')这两个符号啦。其正则表达式形如:编译器

^[0-9][0-9a-zA-Z_]*$io

如此以来数字类型就和传统意义上的数字不同了。形如"110police"也会被当作数字。此外,像3.14这种实数却不会被看成数字。嗯,这的确是问题,可是我不想在如今就解决这个问题,暂时无论啦,请先无视~~~。编译

另外一个是正则表达式的定义,tao 语言中将 ` 符号置于两端来表示正则表达式。(什么,找不到这个符号,嗯,这个符号在“1”的左边,直接按下便可打出。)为何用这个符号而不用 / 分开呢,猜一猜为何呢?嗯,真正开始编码的时候揭示答案吧。

再而后,这些对编译器意义不大,但仍是有点用处的类型:

  • 注释(Annotation)
  • 空格(Space)
  • 回车(NewLine)
  • 其中注释以 # 开始,单行注释。

最后的最后,还有一个类型是必须:

  • 终止符(EndSymbol)

这个类型不对应任何程序员可输入的形式,实际上,词法分析器会在解析完全部源代码以后,自动以一个该类型的单词结尾。这个类型是专门给语法分析器(Parser)使用的。

相关文章
相关标签/搜索