这学期的编译原理课上,我们以C-Minus,一个C语言子集,作为源语言,实现词法分析、语法分析、三地址代码生成等功能的编译器(或解析器)。
代码见GitHub:https://github.com/frankgx97/compiler
Flex与词法分析
进行词法分析之前首先对字符表进行定义。根据CMinus的语法定义,需要进行识别的字符集主要包括如下部分:
关键字:
if,else,while,int,void,return
运算符:
+,-,*,/
比较运算符:
<,<=,>,>=,==,!=,,
标识符:
ID
数字:
NUM
一个flex词法分析文件和bison一样分为声明,定义,规则4个部分。
其中,定义部分用来通过正则表达式定义单词,如数字可定义为{digit}+
。
letter [a-zA-Z] digit [0-9] ID ({letter}|{digit})+|{letter}+({letter}|{digit})* NUM {digit}+ SPACES (\t|\0|\r|\n|\ )+ COMMENT \/\*([^\*^\/]*|[\*^\/*]*|[^\**\/]*)*\*\/