本文讲解关于如何用lex工具来编写一个简易版的C语言的词法分析器。我主要通过一个完整的项目例子来进行讲解。当然这篇文章面向已经对lex有所了解但还不会具体运用的读者,如果对lex一无所知,请看我的另一篇文章。
Lex使用讲解
下面进入本文主题。
- 项目简介
首先先提供我这个项目将要完成的软件的要求。目标是利用lex编写C–(C语言子集)语言的词法分析器。完成C–语言的词法分析器,词法分析器的输入为C–源代码,输出为识别单词的二元属性,其中C–的定义大体如下:
关键字:while break continue for if else float int void return main
算符包括:+ - * / = >= <= ==
界符包括:( ){ } ;
标识符常数定义与C大体相同,同时包含了注释的处理。 - lex源码的编写
2.1 由于我们已经得知lex源文件主要是分为三个部分,首先是第一部分定义段的编写,话不多说,先上代码。
%{
int wordCounter = 0;
int charCounter=0;
int column =0,line=1;
void addLine(int);
void addColumn(int);
void clearColumn();
void addChar(int);
void addWord(int);
%}
line_comment (\/\/.*\n)
char '[^']'
string \"[^\"]*\"
letter [A-Za-z_]
digit [0-9]
identifier {
letter}({
letter}|{
digit})*
reserveword "break"|"main"|"continue"|"else"|"float"|"for"|"if"|"int"|"return"|"void"|"while"
int {
digit}+
float {
digit}*(\.{
digit}+)?(e|E[+\-]?{
digit}+)?
operator "-"|"+"|"="|"=="|"*"|"/"|"<="|&#