/ / Wie verwende ich C ++ in Flex und Bison? - c ++, c, Bison, Flex-Lexer

Wie verwende ich C ++ in Flex und Bison? - C ++, C, Bison, Flex-Lexer

Ich habe ein Projekt für die Schule, bei dem wir Flex und Bisons verwenden müssen. Ich möchte C ++ verwenden, um Zugriff auf STL und meine eigenen Klassen zu haben, die ich geschrieben habe. Wir haben folgendes Makefile erhalten:

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 und analysieren.Sie haben anfängliche Flex / Bison-Sachen, um Scanner und Parser zu generieren. Ich muss diesen Dateien meine eigenen Sachen hinzufügen. symtab. {h, c} soll eine Implementierung einer Symboltabelle sein. attr. {h, c} steht für eine Attributmagie. Ich möchte symtab.c zu einer .cc-Datei machen, damit ich STL verwenden kann. Ich habe auch andere Gründe für die Verwendung von C ++.

Ich habe versucht, eine parse.ypp -Datei zu verwenden, sodass eine .cpp-Datei generiert wird. Aber das Problem ist, dass ich nicht die richtige .h-Datei bekomme. Ich habe das Makefile folgendermaßen geändert:

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

Kann mir jemand sagen, was ich hinzufügen oder tun mussC ++ zum Laufen bringen? Es sollte beachtet werden, dass ich der .y (oder .ypp) -Datei ein paar Sachen hinzugefügt habe, die sich mit dem Wechsel von C nach C ++ befassen. Insbesondere musste ich einige Sachen als extern deklarieren. Mein Hauptproblem ist, dass scan.l bei der Ausführung von make eine Reihe von Syntaxfehlern enthält, und dies scheint zu sein, da parse.tab.h nicht eingeschlossen werden kann (da es niemals generiert wird).

Antworten:

3 für die Antwort № 1

Sie müssen nichts mit Flex oder Bison machen, um C ++ zu verwenden, ich habe es schon oft getan. Sie müssen nur sicherstellen, dass Sie g ++ verwenden, nicht gcc.

Ihre Probleme betreffen das Makefile, nicht den Code.


4 für die Antwort № 2
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()

1 für die Antwort № 3

Es gibt einige Unterschiede, die Sie im Detail überprüfen können Hier.


0 für die Antwort № 4

Verwenden Sie entweder einen C-Compiler oder einen C ++ - Compiler, aber nicht beide (bis Sie wissen, was Sie vorhaben). Sie werden sich ansonsten sicher viele Male auf beide Füße schießen. Das Mischen von gcc und g ++ ist nicht gut.

Diese Zeile ist verdächtig:

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

Sie scheinen auch nicht zu benutzen CC Überall, wo man das verwendet, hätte das Leben leichter gemacht.

Angenommen, Sie ändern nicht eine einzelne Zeile des C-Codes. Möglicherweise schlagen Sie einige Fehler und eine Reihe von Warnungen (wie veraltete Header usw.) vor. Sie müssen diese auch beheben.


-2 für die Antwort № 5

Wenn Sie Parser in C ++ machen, würde ich empfehlen, sich diese anzusehen Steigern Sie den Geist. Es ist so viel schöner zu handhaben als Bison / Yacc.

Von Hier:

Geist ist eine objektorientierte rekursive AbstammungParser-Generator-Framework, implementiert mit Template-Meta-Programmiertechniken. Mit Ausdruckvorlagen können wir die Syntax der erweiterten Backus-Normalform (EBNF) vollständig in C ++ approximieren.