词法分析
词法分析是编译的第一阶段。主要任务是读入源程序的输入字符,将他们组成词素,生成并输出一个词法单元序列,每个词法对应于一个词素。这个词法单元序列被输出到语法分析器进行语法分析。词法分析器通常还要和符号表进行交互。
——《编译原理》(龙书)
词法分析设计
其实词法分析也就是对字符串的匹配问题。在实验中,我采用了以枚举类容纳正则表达式进行匹配的方式,涉及到的难点主要有:注释的处理、各类符号正则匹配。
整体架构
本次项目没有对编码前的设计进行修改。
目前项目架构如下:
1 | . |
在Input
类中,首先将文件按行存储到ArrayList<String> lines
中,使用getFollowingChars
函数实现从当前字符预读取n个字符,使用goForward
函数实现每次前进n个字符,使用match
函数进行正则匹配,使用skipBlacks
函数跳过不可见字符。
在Tokenizer
类中,通过initToken
方法实现了程序主要功能。
注释处理
主要有两种形式的注释:
//
:只要出现,那么就跳过当前行之后的所有字符。/* ... */
:出现/*
后,先向前2个字符(此刻对应字符为/
),不断逐字符匹配,直到匹配到*/
为止,并忽略期间的所有字符。
1 | public class Tokenizer { |
各类符号正则匹配
对于各类符号来说,难点如下:
注意顺序
int
、const
等保留字要在Ident
前面==
要在=
前面。
注意转义(个人建议是不确定的都转了就完事了)
OR("\\|\\|"),
MULT("\\*"),
PLUS("\\+"),
LPARENT("\\("),
LBRACK("\\["),
LBRACE("\\{"),
- 注意分词
int
、const
等保留字匹配时后面需要加上\\b
。- 也可以使用前瞻断言
?!\\w
。
Type枚举类如下:
1 | enum Type{ |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LLLeoのBlog!