使用flex和bison解析文件
我需要使用flex和Bison解析以下文件: 新文件使用flex和bison解析文件,bison,flex-lexer,text-parsing,fileparsing,Bison,Flex Lexer,Text Parsing,Fileparsing,我需要使用flex和Bison解析以下文件: 新文件 BEGIN BLOCK BLK_ROWDEC NAME cell_rowdec SIZE UNI_rowdecSize ITERATE itr_rows DIR
BEGIN BLOCK BLK_ROWDEC
NAME cell_rowdec
SIZE UNI_rowdecSize
ITERATE itr_rows
DIRECTION lgDir_rowdec
STRAP STRD1,STRD3,STRD2
WRAP WRD1
VIA VIAB,VIAC,VIAD
ENDS BLK_ROWDEC
我想读上面的文件,为此我写了这段代码
法律
了解如何调试解析器非常重要。在文件的第一部分中,定义YYDEBUG 1,并在主集合中定义YYDEBUG=1。这将允许您在运行解析器ant时看到确切的步骤,然后您将知道错误所在。知道这一点非常重要,因为错误很难发现。所以调试你的程序吧
%{
#include <cstdio>
#include <cstring>
#include <iostream>
#include <stdio.h>
#define YYDEBUG 1 // This is new
using namespace std;
extern "C" int yylex();
extern "C" FILE *yyin;
void yyerror(const char* s);
%}
int main(){
yydebug = 1; // This is new
yyparse();
}
%{
#包括
#包括
#包括
#包括
#定义YYDEBUG 1//这是新的
使用名称空间std;
外部“C”int yylex();
外部“C”文件*yyin;
无效错误(常量字符*s);
%}
int main(){
yydebug=1;//这是新的
yyparse();
}
也
yylval.sval=strdup(yytext)
在此之后,您需要检查yylval.sval是否为NULL,因为strdup(yytext)
首先分配内存,然后该函数复制字符串,因此如果内存分配失败,strdup(yytext)
将返回NULL 了解如何调试解析器非常重要。在文件的第一部分中,定义YYDEBUG 1,并在主集合中定义YYDEBUG=1。这将允许您在运行解析器ant时看到确切的步骤,然后您将知道错误所在。知道这一点非常重要,因为错误很难发现。所以调试你的程序吧
%{
#include <cstdio>
#include <cstring>
#include <iostream>
#include <stdio.h>
#define YYDEBUG 1 // This is new
using namespace std;
extern "C" int yylex();
extern "C" FILE *yyin;
void yyerror(const char* s);
%}
int main(){
yydebug = 1; // This is new
yyparse();
}
%{
#包括
#包括
#包括
#包括
#定义YYDEBUG 1//这是新的
使用名称空间std;
外部“C”int yylex();
外部“C”文件*yyin;
无效错误(常量字符*s);
%}
int main(){
yydebug=1;//这是新的
yyparse();
}
也
yylval.sval=strdup(yytext)
在此之后,您需要检查yylval.sval是否为NULL,因为strdup(yytext)
首先分配内存,然后该函数复制字符串,因此如果内存分配失败,strdup(yytext)
将返回NULL bison/flex解析器从输入开始到结束按顺序工作。他们不会跳过输入,寻找可能匹配的内容。但为什么它没有打印任何内容?我的脚本有什么问题?请帮助我@ricibison/flex解析器从输入开始到结束按顺序工作。他们不会跳过输入,寻找他们可能能够匹配的内容。但为什么它没有打印任何内容?我的脚本有什么问题?请帮助我@riciI添加这两个语句,但它不起作用。我没有得到任何输出。请帮助我..这很紧急您需要先执行yacc-d
命令,因为yacc
正在为lex
生成.h
文件。那个文件告诉莱克斯什么是代币。然后你需要做flex。最后的编译过程也是错误的,你需要将yacc
文件编译成目标文件,lex
文件编译成目标文件,然后将它们合并成一个可执行文件。如果你不理解我刚才说的话,请阅读flex和yacc的文档,当我调试代码时,我发现以下几行代码:开始解析进入状态0读取令牌:下一个令牌是TOK_STRING()错误。语法错误看在上帝的份上,在调试模式下输入一个又一个令牌,您将发现错误。例如:1输入2输入3输入等,这样您将找到错误所在。我添加了这两个语句,但它不起作用。我没有得到任何输出。请帮助我..这很紧急您需要先执行yacc-d
命令,因为yacc
正在为lex
生成.h
文件。那个文件告诉莱克斯什么是代币。然后你需要做flex。最后的编译过程也是错误的,你需要将yacc
文件编译成目标文件,lex
文件编译成目标文件,然后将它们合并成一个可执行文件。如果你不理解我刚才说的话,请阅读flex和yacc的文档,当我调试代码时,我发现以下几行代码:开始解析进入状态0读取令牌:下一个令牌是TOK_STRING()错误。语法错误看在上帝的份上,在调试模式下输入一个又一个令牌,您将发现错误。例如:1输入2输入3输入等,这样您将找到错误所在。
flex lex.l
bison -d yacc.y
g++ yacc.tab.c -lfl -o scanner.exe
%{
#include <cstdio>
#include <cstring>
#include <iostream>
#include <stdio.h>
#define YYDEBUG 1 // This is new
using namespace std;
extern "C" int yylex();
extern "C" FILE *yyin;
void yyerror(const char* s);
%}
int main(){
yydebug = 1; // This is new
yyparse();
}