我正在尝试使用flex和bison解析一个输入文件,但在编译程序时遇到了困难。我附上我的flex和bison代码以及错误信息。
请帮助我解决这些错误。
lex.l
%{
#include <iostream>
#include <stdio.h>
#include "yacc.tab.h"
#define YY_DECL extern "C" int yylex()
using namespace std;
%}
DOT "."
COLON ":"
SEMICOLON ";"
COMMA ","
ANGLE_LEFT "<"
ANGLE_RIGHT ">"
AT "@"
EQUAL "="
SQUARE_OPEN "["
SQUARE_CLOSE [^\\]"]"
OPENBRACE "\("
CLOSEBRACE "\)"
QUOTE "\""
QUOTE_OPEN "\""
QUOTE_CLOSE [^\\]"\""
SPACE " "
TAB "\t"
CRLF "\r\n"
QUOTED_PAIR "\\"[^\r\n]
DIGIT [0-9]
ALPHA [a-zA-Z]
QTEXT [0-9a-zA-Z!#$%&'()*+,\-.\/:;<=>?@\[\]^_`{|}~]
%%
[a-zA-Z0-9]+ { yylval.sval = strdup(yytext); return TOK_STRING; }
{SPACE}* {return TOK_SPACE; }
{SPACE}*Name.* {return TOK_NAME; }
{SPACE}*SIZE.* {return TOK_SIZE; }
{SPACE}*ITERATE.* {return TOK_ITERATE; }
{SPACE}*DIRECTION.* {return TOK_DIRECTION; }
^{CRLF} { return TOK_EMPTY_LINE; }
{CRLF} {}
. {}/* ignore unknown chars */
yacc.y
%{
#include <cstdio>
#include <cstring>
#include <iostream>
#include <stdio.h>
using namespace std;
extern "C" int yylex();
extern "C" FILE *yyin;
void yyerror(const char* s);
%}
%union
{
char* sval;
};
%token <sval> TOK_NAME
%token <sval> TOK_SIZE
%token <sval> TOK_STRING
%token <sval> TOK_ITERATE
%token <sval> TOK_DIRECTION
%token TOK_SPACE
%%
str:
TOK_SPACE TOK_NAME TOK_SPACE TOK_STRING
{
cout << "Value:" << $2 << "->" << $4;
}
;
%%
int main(void) {
FILE * pt = fopen("new file ", "r" );
if(!pt)
{
cout << "Bad Input.Noexistant file" << endl;
return -1;
}
yyin = pt;
do
{
yyparse();
}while (!feof(yyin));
}
void yyerror(const char *s)
{
cout << "Error. " << s << endl;
exit(-1);
}
我使用以下技术构建这些内容:
flex bas.l
bison -d yacc.y
g++ lex.yy.c yacc.tab.c -lfl -o scanner.exe
编译程序时,我发现以下错误:
请帮助我解决这个问题。/tmp/cceIyDkD.o: 在函数 `main' 中:
yacc.tab.c:(.text+0x708): 对 `main' 的多次定义
/tmp/ccatq95p.o:lex.yy.c:(.text+0x1228): 此处首次定义
/usr/bin/ld: 警告:符号 `main' 的大小已从 /tmp/ccatq95p.o 中的 86 更改为 /tmp/cceIyDkD.o 中的 120
/tmp/cceIyDkD.o: 在函数 `yyparse()' 中:
yacc.tab.c:(.text+0x2d6): 对 `yylex' 的未定义引用
collect2: ld 返回了 1 个退出状态
g++ --version
命令打印的第一行是什么?我认为你可能正在使用一个非常老的编译器,这可能会导致一些问题。(另外,你的问题中说你的扫描器文件名为lex.l
,但你调用了flex bas.l
。我假设那只是一个笔误。) - rici