有关flex的c++编程方法

来源:互联网 发布:货到付款淘宝网衣服 编辑:程序博客网 时间:2024/04/29 19:27

    最近我忙着一些有关编译原理相关的程序,用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

 

 

就这些 希望对大家有所帮助,也希望大家多提意见,共同探讨。

 

 

 

原创粉丝点击