使用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

我需要使用flex和Bison解析以下文件:

新文件

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();
}