代码之家  ›  专栏  ›  技术社区  ›  Tom

如何在Flex和BISY中使用C++?

  •  6
  • Tom  · 技术社区  · 16 年前

    我有一个学校项目,我们需要使用flex和bison。我想用C++来访问STL和我自己编写的类。我们收到了以下makefile:

    CC = gcc 
    CFLAGS = -g 
    
    OBJs = parse.tab.o symtab.o attr.o lex.yy.o 
    
    default: parser
    
    parser: ${OBJs}
        ${CC} ${CFLAGS} ${OBJs} -o parser -lfl
    
    lex.yy.c: scan.l parse.tab.h attr.h
        flex -i scan.l
    
    parse.tab.c: parse.y attr.h symtab.h
        bison -dv parse.y
    
    parse.tab.h: parse.tab.c
    
    clean:
        rm -f parser lex.yy.c *.o parse.tab.[ch] parse.output
    
    depend:
        makedepend -I. *.c
    

    scan.l和parse.y有一些最初的flex/bison工具来生成扫描器和解析器。我需要把我自己的东西添加到那些文件中。symtab.h,c应该是符号表的实现。属性h,c用于一些属性魔法。我想让symtab.c成为一个.c c文件,这样我就可以使用stl。我还想使用C++的其他原因。

    我尝试使用parse.ypp文件,以便生成.cpp文件。但问题是我找不到正确的.h文件。我把makefile改成这样:

    CC = g++          # Change gcc to g++
    CFLAGS = -g 
    
    OBJs = lex.yy.o parse.tab.o symtab.o attr.o
    
    default: lex.yy.c parser    # added lex.yy.c so I could just keep lex stuff in C since I don't really need C++ there
    
    parser: ${OBJs}
        ${CC} ${CFLAGS} ${OBJs} -o parser -lfl
    
    lex.yy.o: scan.l parse.tab.h attr.h      # added this rule to use gcc instead of g++
        gcc -c -o lex.yy.o lex.yy.c
    
    lex.yy.c: scan.l parse.tab.h attr.h
        flex -i scan.l
    
    parse.tab.cpp: parse.ypp attr.h symtab.h
        bison -dv parse.ypp
    
    parse.tab.h: parse.tab.cpp      # I want a parse.tab.h but I get parse.tab.hpp
    
    clean:
        rm -f parser lex.yy.c *.o parse.tab.cpp parse.tab.h parse.output
    
    depend:
        makedepend -I. *.c
    

    有人能告诉我,我需要做些什么来增加C++的工作效率呢?应该注意的是,我在Y(或.YP)文件中添加了一些东西来处理从C到C++的移动。尤其是,我必须声明一些东西是外部的。我的主要问题是,当我运行make时,scan.l有很多语法错误,它们似乎是因为它不能包含parse.tab.h(因为它从未生成过)。

    5 回复  |  直到 9 年前
        1
  •  5
  •   Zifre    16 年前

    你不需要用Flex或BySun做任何事情来使用C++,我已经做过很多次了。你只需要确保你使用的是G++,而不是GCC。

    您的问题是makefile,而不是代码。

        2
  •  4
  •   piotr    16 年前
    For using flex with C++:
     1: read the flex docs:
     2: use flex -+ -o file.cc parser.ll
     3: In the .ll file:
    
    %option c++
    %option yyclass="Your_class_name"
    %option batch
    
     4: In your .hh file, derive Your_class_name from  public yyFlexLexer
     5: you can then use your_class_instance.yylex()
    
        3
  •  1
  •   justinhj    16 年前

    您可以详细查看一些差异 here .

        4
  •  0
  •   dirkgently    16 年前

    使用C编译器或C++编译器,但不能同时使用(直到你知道你要做什么)。否则你肯定会用双脚多次射击自己。混合gcc和g++不好。

    此行可疑:

    lex.yy.o: scan.l parse.tab.h attr.h      # added this ...
    gcc -c -o lex.yy.o lex.yy.c
    

    而且,你似乎没有使用 CC 任何地方,使用它都会让生活更轻松。

    假设您不更改一行C代码,您可能会遇到一些错误和相当多的警告(如不推荐使用的头等)。你也得把它们修好。

        5
  •  -2
  •   lothar    16 年前

    如果你正在C++中做解析器,我建议你看看 Boost Spirit . 它比野牛/游艇要好得多。

    here :

    spirit是一个面向对象的递归下降解析器生成器框架,使用模板元编程技术实现。表达式模板允许我们完全在C++中近似地扩展Backus Normal Form(EBNF)的语法。