- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在编译代码时遇到问题(未定义对“yylex”的引用
)。让我们从代码片段开始,我将在下面描述详细信息:
弹性:
%{
#include <stdlib.h>
extern int yylex();
%}
%%
"=" {return EQ;}
"!=" {return NE;}
"<" {return LT;}
">" {return GT;}
":=" {return ASSIGN;}
";" {return SEMICOLON;}
"IF" {return IF;}
"THEN"{return THEN;}
"END" {return END;}
[_a-z]+ {yylval.text = strdup(yytext); return IDENTIFIER;}
[ \t]+
[0-9]+ {
yylval.var = atoi (yytext);
return NUMBER;
}
[-+/^*'%'()] {
return *yytext;
}
\n return RESULT;
%%
Bison :
%{
extern "C"
{
int yyparse();
int yylex(void);
void yyerror(char *s){}
int yywrap(void){return 1;}
}
#include <iostream>
#include <vector>
#include <string>
#include <stdlib.h>
#include <map>
using namespace std;
vector <string> instructions;
map <> vars;
%}
%union{
char* text;
int var;
}
%token EQ
%token NE
%token ASSIGN
%token SEMICOLON
%token IF
%token THEN
%token <text> IDENTIFIER
%token <var> NUMBER
%token <var> RESULT
%left '+' '-'
%left '*' '/' '%'
%right '^'
%%
exp: NUMBER
| IDENTIFIER
| IDENTIFIER "+" IDENTIFIER
| IDENTIFIER "-" IDENTIFIER
;
%%
int main(void){
yyparse();
}
这是我用来编译和运行程序的 bash 脚本:
#!/bin/bash
clear
rm launcher lex.yy.cpp *.tab.cpp *.tab.hpp
bison -d -o list.tab.cpp *.y
flex -o lex.yy.cpp *.l
g++ -o launcher *.cpp -lfl
为了清楚起见,我只在此处发布代码的最重要部分,因为其余部分在这里并不是必需的。无论如何,如果有人想查看完整代码,请将其发布在这里:http://pastebin.com/1rS2FBJj .这是一个更大的代码块,但占据了更多的位置。
当我尝试将所有文件编译为 *.c 文件然后使用 gcc 时,一切正常。但是,当我尝试将编译器切换到 g++ 并因此将文件切换到 cpp 时,我不断收到此错误:
list.tab.cpp: In function ‘int yyparse()’:list.tab.cpp:1397: warning: deprecated conversion from string constant to ‘char*’list.tab.cpp:1540: warning: deprecated conversion from string constant to ‘char*’/tmp/ccdqpQVx.o: In function `yyparse':list.tab.cpp:(.text+0x252): undefined reference to `yylex'collect2: ld returned 1 exit status
谁能给我一个提示,最好的方法是什么?
最佳答案
在您的 Flex 文件中,您声明:
extern int yylex();
当编译为 C++ 时,它声明了一个具有 C++ 链接 的函数。在您的 Bison 文件中,您声明:
extern "C" {
int yylex();
}
这给了它 C 链接。它们是两个不同的函数。您定义 C++ 版本(或者更确切地说,Flex 为您定义它),但是您声明 C 版本,而 C 版本是编译器认为您尝试的版本调用(在 Bison 生成的代码中)。链接器发现使用了 C 版本,但找不到定义。
选择一个链接并始终如一地使用它。 (我会选择 C++,因为它允许完全省略代码中的“外部”内容。)
关于c++ - 使用 g++、bison 和 flex 进行编译时,yyparse() 中未定义对 `yylex' 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431942/
我使用同一个输入文件多次调用yyparse()。我必须从文件开头开始解析到某个点,然后跳转到同一文件中的其他位置(解析那里的一些行),然后返回到原始位置并从那里再次开始解析。这我已经做过很多次了。每次
我的 main.cpp 看起来像这样: #include #include #include #include "astgen.h" #include "astexec.h" extern in
在我的 bison/flex 程序中,在调用 yyparse() 之后,会打印一个前导制表符,但我不知道为什么。你能看出哪里出了问题吗? 这会调用 bison 代码,并在 yyparse() 返回后立
我正在为我正在处理的自定义微 Controller 编写汇编程序。我已经让汇编器达到了将指令汇编为二进制的程度。 但是,我现在在让标签正常工作时遇到问题。目前,当我的汇编程序遇到一个新标签时,它会存储
我正在实现一个逐行数据解析器,它通过在循环中调用 yyparse 来工作。唯一的问题是,除了全局变量之外,我无法提取数据,这是我希望避免的。有小费吗? 最佳答案 您可以使用 bison 的 %pars
我正在开发一种脚本语言和 C API,以便 C 程序可以与我的语言交互。它基于 LUA 的堆栈方法。但是,我在两个模块之间的同步方面遇到了一些问题...... 在 API 的 init 函数上,我启动
我的大学有一个项目,用C语言制作一个迷你shell。为了解析命令行,我使用以下工具:lex 和 yacc。但我想解析该行。当检测到 token 时,在我的 struct 命令中添加参数,当我找到换行符
friend 们,我正在解析一个 bibtex 文件,文件中有多个 bibtex 条目,例如 @Book{a1, Title="ASR", Publisher="oxf", A
我正在制作一个汇编程序。我正在使用 bison 和 flex 来这样做。我还有一个 C 文件,其中有我的主要功能。但是由于某种原因在调用 yyparse() 函数后程序崩溃了。 这是我的代码示例。但它
我正在使用 bison 和 flex 开发一个简单的解释器。当我编译我的代码时,我收到“未定义对‘yyparse’的引用”的错误。 mylang.ll %{ /********************
我试图在循环中解析输入,直到用户输入“退出”。但是,当我通过参数传递查询时,yyparse() 有效,但当我在循环中执行相同的过程时,它显示错误。 我已经检查了“cmd”,它显示了准确输入的用户查询。
难怪我无法从我的 flex 文件链接到它。我检查了这个并取出声明“YYSTYPE yylval;”从 yyparse 开始,它按预期工作。这肯定不是使用 bison 和 flex 的正确方法吗?有人可
这个问题类似于this one但对于 yyparse,而不是 yylex。 我已经为此奋斗了几个小时了!我想从一个 C 程序(实际上是一个 C++ 程序,但我最终使用旧的 flex/bison 而不是
之前,我没有从 yacc 读取生成的代码小心。现在我看到了这样一段代码: #define yyparse ol_parser_parse 我知道yyparse的定义如下: int yyparse (v
我在我的 C 代码中包括了两个不同的词法解析器,因此要包括第二个在其上定义的前缀: %option prefix="prep" 当我将它集成到全局项目中时,它编译时没有错误,但在执行时,如果我尝试调用
我正在尝试实现 flex 和 bison,但此循环返回了核心转储的段错误第一个文件工作正常,但下一个文件崩溃并打印成终端段错误。 DIR *dir; struct dirent *ent; i
我想从 lex/yacc 生成两个独立的解析函数。通常 yacc 给你一个函数 yyparse() ,你可以在你需要做一些解析时调用它,但我需要有几个不同的 yyparses,每个都与不同的词法分析器
仍在学习 yacc 和 flex,并遇到了我的操作方法和教程未涵盖的场景。我正在尝试解析一个文件,并且在进行过程中,我正在对放置在 parser.y 文件中的代码进行一些辅助错误检查。当我遇到字典顺序
我正在尝试学习一些 flex/bison,我正在阅读 John Levine (O'Reilly) 的 Flex & Bison。有一个我需要运行的示例,但是由于出现以下错误,我无法运行它: /tmp
我正在使用 Windows 上的 Flex 和 Bison 为一种相对简单的语言创建编译器。但是编译器告诉我函数 yyerror 和 yyparse 没有在正确的范围内声明。经过一番阅读后,我发现问题
我是一名优秀的程序员,十分优秀!