- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 flex 和 bison 来创建一个编译器。但是当我尝试编译时收到错误。
这是错误:
flex --header-file=lex.h --outfile=lex.cc lex.ll
g++ -w -Wall -Wextra -ansi -g -c -o lex.o lex.cc -lm -ll
bison -v --output-file=parse.cc --defines=parse.hh --warnings=all --feature=all parse.yy
g++ -w -Wall -Wextra -ansi -g -c -o parse.o parse.cc
g++ -w -Wall -Wextra -ansi -g -c -o main.o main.cc
g++ -w -Wall -Wextra -ansi -g -fkeep-inline-functions -o LFIO lex.o parse.o function.o main.o -lfl -lm -ll
parse.o: In function `yyparse()':
/root/LFIO-combine/parse.cc:1199: undefined reference to `yylex'
main.o: In function `main':
/root/LFIO-combine/main.cc:21: undefined reference to `yyin'
/root/LFIO-combine/main.cc:21: undefined reference to `yyin'
collect2: error: ld returned 1 exit status
make: *** [LFIO] Error 1
这是我的生成文件:
CXXFLAGS = -w -Wall -Wextra -ansi -g
OBJECTS = lex.o parse.o function.o main.o
LFIO : $(OBJECTS)
g++ $(CXXFLAGS) -fkeep-inline-functions -o LFIO $(OBJECTS) -lfl -lm -ll
clean :
rm -f *.o
lex.cc : lex.ll
flex --header-file=lex.h --outfile=lex.cc lex.ll
parse.hh : parse.cc
parse.cc : parse.yy function.h algorithm.h
bison -v --output-file=parse.cc --defines=parse.hh --warnings=all --feature=all parse.yy
%.o: %.cc %.h
g++ $(CXXFLAGS) -c -o $@ $< -lm -ll
main.o : main.cc lex.h parse.hh function.h algorithm.h
function.o : function.h function.cc
parse.o : parse.cc parse.hh function.h algorithm.h
lex.o :lex.h algorithm.h function.h
这是我的 lex.ll
%option c++
%option ecs
%option nodefault
%option stack
%option warn
%option yylineno
%{
#include "function.h"
#include "parse.hh"
#include <limits.h>
#include <iostream>
#include <sstream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int yyFlexLexer::yywrap() { return 1; }
%}
ATOM [A-Z][a-zA-Z0-9_']*
VARIABLE [a-z][a-zA-Z0-9_']*
%%
[ \t\n] ;
{VARIABLE} { return (TOK_VARIABLE);}
{ATOM} { return (TOK_ATOM);}
":-" {}
"," {}
"." {}
<<EOF>> {yyterminate();}
%%
parse.yy 是这样的:
%defines
%define api.token.prefix {TOK_}
%{
#include "function.h"
#include "lex.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#ifdef MS_WINDOWS
#include <malloc.h>
#define alloca_alloca
#endif
void yyerror(const char *s)
{
fprintf (stderr, "%s\n", s);
}
extern "C" int yylex(void);
%}
%union{
......
}
%type ......
%%
......
然后main.cc是这样的:
#include "function.h"
#include "algorithm.h"
#include "parse.hh"
#include "lex.h"
extern "C" int yylex(void);
extern FILE *yyin;
extern FILE *yyout;
extern int fopen();
extern int yyparse(void *);
int main(int argc, char **argv){
if(argc > 1){
if(!(yyin = fopen(argv[1], "r"))) {
perror(argv[1]);
return (1);
}
}
//yylex();
yyparse();
......
return 0;
}
有谁知道是什么原因导致这些错误以及如何解决这些错误?如果有人能抽出时间检查这些错误,我将不胜感激。
最佳答案
将我的评论收集到一个答案中。
有两个问题:
首先是代码被编译为 C++,这意味着 yylex
的定义将也被编译为 C++。这意味着它不是 extern "C"
。要解决此问题,请从所有声明中删除 extern "C"
。
第二个问题有两个方面:第一个是符号yyin
好像没有在任何地方定义,所以你需要自己做。第二件事是它应该是指向 std::istream
对象的指针,而不是 FILE *
。
要解决第二个问题,使用 yyin
,我建议您将定义添加到词法分析器声明 block 中:
%{
// Your includes...
int yyFlexLexer::yywrap() { return 1; }
// Add definition of yyin
std::istream* yyin;
%}
然后更新 main.cc
文件中的 extern
声明以匹配定义。
关于c++ - 对 `yylex' 的 undefined reference && 对 `yyin' 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39052715/
本文整理了Java中jxl.biff.formula.Yylex.yylex()方法的一些代码示例,展示了Yylex.yylex()的具体用法。这些代码示例主要来源于Github/Stackoverf
本文整理了Java中org.json.simple.parser.Yylex.yylex()方法的一些代码示例,展示了Yylex.yylex()的具体用法。这些代码示例主要来源于Github/Stac
本文整理了Java中org.apache.dubbo.common.json.Yylex.yylex()方法的一些代码示例,展示了Yylex.yylex()的具体用法。这些代码示例主要来源于Githu
本文整理了Java中de.odysseus.staxon.json.stream.impl.Yylex.yylex()方法的一些代码示例,展示了Yylex.yylex()的具体用法。这些代码示例主要来
本文整理了Java中com.taobao.middleware.logger.json.parser.Yylex.yylex()方法的一些代码示例,展示了Yylex.yylex()的具体用法。这些代码
我正在尝试将位置信息添加到flex和bison中。但是我的野牛仍然使用int yylex(void),但是找不到int yylex(YYSTYPE *yylval_param, YYLTYPE *yy
所以我的问题很简单,我想之前已经有人回答了,但我无法找到关于它的好线索:我可以解析一次文件,收集一些必要的信息来初始化我的结构,然后解析第二次是“真的”吗? 当我两次调用 yylex() 时,它似乎什
我在 Flex 文件的定义部分中声明全局作用域指针时遇到问题,然后我在主文件的开头 malloc 它,但是 一旦我的程序运行到yylex(),指针的值就会设置为NULL。 我在整个程序中都需要这个指向
我正在尝试学习如何构建基于 C++ 的词法分析器/解析器,我正在关注多个在线教程和指南,我的代码主要是根据这两个指南构建的:1 , 2尽管我添加和调整了我认为合适的内容。 首先,我有一个词法分析器的头
我有一个简单的 flex 源代码,它跳过 /* */ 中的注释,应该得到找到的注释数: %{ int in_comment = 0; int count = 0; %} %% \/\* { i
我正在使用词法分析。为此,我使用 Flex然后我获取以下问题。 工作.l int cnt = 0,num_lines=0,num_chars=0; // Problem here. %% [" "]+
本文整理了Java中jxl.biff.formula.Yylex.yytext()方法的一些代码示例,展示了Yylex.yytext()的具体用法。这些代码示例主要来源于Github/Stackove
本文整理了Java中jxl.biff.formula.Yylex.zzUnpackAttribute()方法的一些代码示例,展示了Yylex.zzUnpackAttribute()的具体用法。这些代码
本文整理了Java中jxl.biff.formula.Yylex.zzUnpackTrans()方法的一些代码示例,展示了Yylex.zzUnpackTrans()的具体用法。这些代码示例主要来源于G
本文整理了Java中jxl.biff.formula.Yylex.zzScanError()方法的一些代码示例,展示了Yylex.zzScanError()的具体用法。这些代码示例主要来源于Githu
本文整理了Java中jxl.biff.formula.Yylex.zzUnpackRowMap()方法的一些代码示例,展示了Yylex.zzUnpackRowMap()的具体用法。这些代码示例主要来源
本文整理了Java中jxl.biff.formula.Yylex.zzUnpackAction()方法的一些代码示例,展示了Yylex.zzUnpackAction()的具体用法。这些代码示例主要来源
本文整理了Java中jxl.biff.formula.Yylex.getPos()方法的一些代码示例,展示了Yylex.getPos()的具体用法。这些代码示例主要来源于Github/Stackove
本文整理了Java中jxl.biff.formula.Yylex.zzRefill()方法的一些代码示例,展示了Yylex.zzRefill()的具体用法。这些代码示例主要来源于Github/Stac
本文整理了Java中jxl.biff.formula.Yylex.yybegin()方法的一些代码示例,展示了Yylex.yybegin()的具体用法。这些代码示例主要来源于Github/Stacko
我是一名优秀的程序员,十分优秀!