C++ 当main位于另一个文件中时发生编译错误(g+;+;,bison,flex)
我在编译代码时遇到问题 当main()与yacc解析器位于同一个文件中时,它工作,但当我将main()放入另一个文件时,它不工作 这是我的Flex文件:(lex1.ll) 当我编译时,我得到了这个错误C++ 当main位于另一个文件中时发生编译错误(g+;+;,bison,flex),c++,c,bison,yacc,flex-lexer,C++,C,Bison,Yacc,Flex Lexer,我在编译代码时遇到问题 当main()与yacc解析器位于同一个文件中时,它工作,但当我将main()放入另一个文件时,它不工作 这是我的Flex文件:(lex1.ll) 当我编译时,我得到了这个错误 bison -d yac1.yy flex --header-file="lexheader.h" lex1.ll g++ -o parser yac1.tab.cc lex.yy.c testlex.cc -lfl testlex.cc: In function ‘int main()’: te
bison -d yac1.yy
flex --header-file="lexheader.h" lex1.ll
g++ -o parser yac1.tab.cc lex.yy.c testlex.cc -lfl
testlex.cc: In function ‘int main()’:
testlex.cc:21:24: error: ‘yyparse’ was not declared in this scope
make: *** [parser] Error 1
PS:对我来说,用g++编译是必要的。用gcc我有一个工作代码
我们非常感谢您在这方面提供的任何帮助
谢谢。您需要在testlex.cc
文件中声明yyparse
函数:
int yyparse();
这就是所谓的函数原型,它告诉编译器函数存在并且可以调用
在仔细查看源代码之后,我现在知道了为什么现有的原型不起作用的原因:这是因为您声明它是“代码>外部”C”/代码>,但编译的文件是C++源。<代码>外部“C”/CODE告诉编译器,<代码> yyPARSE>代码>函数是一个旧的C样式函数,但随后您继续用C++编译器编译源代码。这导致名称不匹配。
您需要在testlex.cc
文件中声明yyparse
函数:
int yyparse();
这就是所谓的函数原型,它告诉编译器函数存在并且可以调用
在仔细查看源代码之后,我现在知道了为什么现有的原型不起作用的原因:这是因为您声明它是“代码>外部”C”/代码>,但编译的文件是C++源。<代码>外部“C”/CODE告诉编译器,<代码> yyPARSE>代码>函数是一个旧的C样式函数,但随后您继续用C++编译器编译源代码。这导致了名称不匹配。
您是否阅读了该文件?它有一章是关于一个完整的例子(非常类似于你的)可以明确声明<代码> yyPARSE < /C> >,但真正的C++解析器可能更好。
您的Makefile
不是很好。你可以吃点像这样的东西
LEX= flex
YACC= bison
LIBES= -lfl
CXXFLAGS= -Wall
parser: lex1.o yac1.tab.o lex.yy.o testlex.o
$(LINKER.cc) -o $@ $^ $(LIBES)
lex1.cc: lex1.ll
$(LEX) --header-file="lexheader.h" $< -o $@
yac1.tag.cc: yac1.yy
$(YACC) -d $<
LEX=flex
野牛
LIBES=-lfl
CXXFLAGS=-Wall
解析器:lex1.o yac1.tab.o lex.yy.o testlex.o
$(LINKER.cc)-o$@$^$(LIBES)
lex1.cc:lex1.ll
$(LEX)--头文件=“lexheader.h”$<-o$@
yac1.tag.cc:yac1.yy
$(YACC)-d$<
还需要花时间阅读的文档。您可能想使用asremake-x
来调试Makefile
您阅读了吗?它有一章是关于一个完整的例子(非常类似于你的)
可以明确声明<代码> yyPARSE < /C> >,但真正的C++解析器可能更好。
您的Makefile
不是很好。你可以吃点像这样的东西
LEX= flex
YACC= bison
LIBES= -lfl
CXXFLAGS= -Wall
parser: lex1.o yac1.tab.o lex.yy.o testlex.o
$(LINKER.cc) -o $@ $^ $(LIBES)
lex1.cc: lex1.ll
$(LEX) --header-file="lexheader.h" $< -o $@
yac1.tag.cc: yac1.yy
$(YACC) -d $<
LEX=flex
野牛
LIBES=-lfl
CXXFLAGS=-Wall
解析器:lex1.o yac1.tab.o lex.yy.o testlex.o
$(LINKER.cc)-o$@$^$(LIBES)
lex1.cc:lex1.ll
$(LEX)--头文件=“lexheader.h”$<-o$@
yac1.tag.cc:yac1.yy
$(YACC)-d$<
还需要花时间阅读的文档。你可能想使用as
remake-x
来调试你的Makefile
直觉上,我认为yac1.tab.hh
会涵盖这一点。否则,拥有extern“C”int yyparse(void)有什么意义代码>在他的yac1.yy
文件中?@Joachim。。非常感谢。它成功了。多么简单的调整。除了在testlex.cc中声明yyparse()之外,我还必须从yac1.yy文件中删除int-yyparse(void)。否则,拥有extern“C”int yyparse(void)有什么意义代码>在他的yac1.yy
文件中?@Joachim。。非常感谢。它成功了。多么简单的调整。除了在testlex.cc中声明yyparse()之外,我还必须从yac1.yy文件中删除int yyparse(void)--c++lex1.ll g++-Wall-c-o lex1.o lex1.cc g++:错误:lex1.cc:没有这样的文件或目录g++:致命错误:没有输入文件编译终止。make:**[lex1.o]Error 4
此Makefile给出以下错误flex--header file=“lexheader.h”--c++lex1.ll g++-Wall-c-o lex1.o lex1.cc g++:错误:lex1.cc:没有这样的文件或目录g++:致命错误:没有输入文件编译终止。make:**[lex1.o]错误4
,因为我假设您不是指名为Flex的Adobe/ApacheUI框架;我将其重新标记为“Flex Lexer”,用于词法分析器;我将其重新标记为“FlexLexer”,用于词法分析器。
int yyparse();
LEX= flex
YACC= bison
LIBES= -lfl
CXXFLAGS= -Wall
parser: lex1.o yac1.tab.o lex.yy.o testlex.o
$(LINKER.cc) -o $@ $^ $(LIBES)
lex1.cc: lex1.ll
$(LEX) --header-file="lexheader.h" $< -o $@
yac1.tag.cc: yac1.yy
$(YACC) -d $<