最近我忙着一些有关编译原理相关的程序,用flex生成c语言的程序是很常见的,但是用flex生成c++的程序却是很少见的。我在网上找了几个例子,但都不能执行,所以我就自己不断尝试,对网上的代码进行修改,最终得到了一个简单的flex生成c++的小程序,别看他小,我可是费了一天的功夫呢。为了大家能够更方便的参考,我把相应代码列在下面。
运行环境:linux
编译器:g++
下面是parser.l文件
%{
#include "data.h"
extern data newData;//不用extern我也想不出什么好办法,怎样将参数传入呢???
%}
%%
/n newData.incNumLines(); newData.incNumChars();
. newData.incNumChars();
%%
int yywrap()
{
return 1;
}
这里要说的是,尽管int yywrap()看上去没什么用,但是却不能少。很多代码中都是少了这个就执行不了了。
然后是个数据结构,只不过是封装了两个变量,然后对他们赋值罢了
下面是 data.h文件
#ifndef __DATA_H
#define __DATA_H
class data{
protected:
int num_lines;
int num_chars;
public:
void setNumLines(int newLines);
void setNumChars(int newChars);
void incNumLines();
void decNumLines();
void incNumChars();
void decNumChars();
int getNumLines();
int getNumChars();
data();
};
#endif
下面是data.cpp文件:
#include "data.h"
data::data()
{
num_lines = 0;
num_chars = 0;
}
void data::setNumLines(int newLines)
{
num_lines = newLines;
}
void data::setNumChars(int newChars)
{
num_chars = newChars;
}
void data::incNumLines()
{
num_lines++;
}
void data::decNumLines()
{
num_lines--;
}
void data::incNumChars()
{
num_chars++;
}
void data::decNumChars()
{
num_chars--;
}
int data::getNumLines()
{
return num_lines;
}
int data::getNumChars()
{
return num_chars;
}
最后给出的是main.cpp文件:
#include <FlexLexer.h>
#include <fstream.h>
#include <string.h>
#include <stream.h>
int num_lines = 0, num_chars = 0;
int main( int /* argc */, char* argv[] )
{
ifstream* pmyFile = new ifstream();//要从文件读入要解析的字符串
pmyFile->open(argv[1],ios::out);//这个文件作为启动参数传入
FlexLexer* lexer = new yyFlexLexer(pmyFile);//分析器的构造函数
while(lexer->yylex()!=0);//逐词分析
printf("total lines:%d/ntotal chars:%d/n",num_lines,num_chars);
delete pmyFile;
delete lexer;
return 0;
}
最后编译:
#flex -+ parser.l
# g++ main.cpp data.cpp lex.yy.cc -o main
然后就可以执行了:
./main data.h
就这些 希望对大家有所帮助,也希望大家多提意见,共同探讨。