Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当main位于另一个文件中时发生编译错误(g+;+;,bison,flex)_C++_C_Bison_Yacc_Flex Lexer - Fatal编程技术网

C++ 当main位于另一个文件中时发生编译错误(g+;+;,bison,flex)

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

我在编译代码时遇到问题

当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()’:
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$<
还需要花时间阅读的文档。您可能想使用as
remake-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 $<