Tag: yacc

如何从lex / yacc获取更多解析错误信息?

如何从lex / yacc获取更多解析错误信息? 目前在我正在使用的lex文件中: int yyerror(const char *msg) { fprintf(stderr, “Parse error: %s\n”, msg); return 0; } 但是当我运行我的程序时,yyerror会输出一条空白消息。 我尝试将yylineno和yytext添加到yyerror但这会导致编译错误。 我尝试将“%error-verbose”添加到yacc文件,并将“%option debug”添加到lex文件,但这些对消息没有任何影响。 我确实注意到yyparse输出一个括号:'{‘来自我试图解析的文件,我不知道这个的意义。 我正在使用win_flex和win_bison。

如何在Lex和Yacc中对String进行标记

参考我们正在使用的LEX YACC lex文件中的读取新行给出语法错误 %{ /* parser for ssa; */ #include #include #include”y.tab.h” %} %% [\t]+ ; \n ; [if]+ printf(“first input\n”); [else]+ return(op); [=]+ return(equal); [+]+ return(op); [*]+ return(op); [-]+ return(op); [\] {return(bblock);} ([[_][az]])|([az][_][0-9]+)|([0-9]+) {return(var);} . ; %% 如果我想将令牌作为字符串,即a_2如何做,我该怎么办? 输入文件是 a_2 = _6 + b_3; a_8 = b_7 – c_5;

从另一个c文件中调用Yacc文件中的函数

我是Lex / Yacc编程的新手。 我有一个关于如何从另一个C文件调用Yacc文件中的函数的问题。 假设我有以下Lex / Yacc代码: calc.l %{ #include “y.tab.h” extern int yylval; %} %% [0-9]+ { yylval=atoi(yytext); return NUMBER;} [ \t]; \n return 0; . return yytext[0]; %% calc.y %{ #include %} %token NAME NUMBER %% statement: NAME ‘=’ expression | expression {printf(“= %d\n”,$1); printf(“yylval= %d”,yylval);} ; expression: NUMBER ‘+’ NUMBER {$$=$1+$3;} | […]

Flex具有启动条件可重入

我正在尝试制作一个依赖于启动条件的可重入扫描器。 我正在跟随类似这个家伙的问题: 用Flex编写重入词法分析器 正如一张海报所提到的,如果您明确创建yyscan_t并将其作为额外参数传递,则扫描程序将起作用。 但是,当使用BEGIN 等操作启动条件时,我仍然会收到yyg undeclared错误消息。 这是一个错误吗? 我应该明确使用yy_push_state和yy_pop_state状态函数吗?

yylineno在yacc文件中始终具有相同的值

对于编译器中的一个项目,我在语法分析器中有一个问题,当我在符号表中添加一个符号时,我在yylineno中总是采用相同的值… 我是在开始时这样做的: %{ int yylex(void); int yyerror(char* yaccProvidedMessage); extern int yylineno; //i declare yylineno from the lexical analyzer extern char *yytext; extern FILE *yyin; int scope=0; int max_scope; %} 当我在符号表中添加内容时,在语法中: 即 lvalue: ID { printf(“<-ID"); add_data_to_symbol_table((char*)($1),scope,yylineno); printf("lineNO:%d",yylineno); } ; 在输出中,当我给出不同行的输入时,它不识别新行 if(x<=2) { if(t<1) { k=2; } } lineNO永远不会改变,总是有1作为价值…… 有任何想法吗?

如何从lex / yacc生成不同的yyparse函数以在同一程序中使用?

我想从lex / yacc生成两个单独的解析函数。 通常yacc会为你提供一个函数yyparse(),当你需要进行一些解析时,你可以调用它,但是我需要有几个不同的yyparses,每个yypars都与不同的词法分析器和语法相关联。 手册页似乎建议使用-p(前缀)标志,但这对我不起作用。 我从gcc那里得到错误,表明yylval没有被正确地重新标记(即它声称没有定义几个不同的令牌)。 有谁知道生成这些单独函数的一般rpocedure? 谢谢

为什么这些冲突出现在XML的以下yacc语法中

我有以下XML语法,工作正常: program : ” root ; root : ” node_list ” ; node_list : node_s | node_list node_s ; node_s : node | u_node | ID ; node : ” ; u_node :” node_list ” |” ” ; attribute_list : attributes | ; attributes : attribute | attributes attribute ; attribute : ID ASSIGNOP ‘”‘ […]

Bison / Yacc语法中的无意连接

我正在尝试使用lex和yacc并遇到一个奇怪的问题,但我认为最好在详细说明问题之前向我们展示我的代码。 这是我的词法分析员: %{ #include #include #include “y.tab.h” void yyerror(char *); %} %% [a-zA-Z]+ { yylval.strV = yytext; return ID; } [0-9]+ { yylval.intV = atoi(yytext); return INTEGER; } [\n] { return *yytext; } [ \t] ; . yyerror(“invalid character”); %% int yywrap(void) { return 1; } 这是我的解析器: %{ #include int yydebug=1; void prompt(); void yyerror(char […]

在开发类似语言的小python时进行缩进控制

我正在使用flex,byacc(用于词法和解析)和C ++开发一个类似语言的小python,但我有一些关于范围控制的问题。 就像python一样,它使用白色空格(或制表符)进行缩进,不仅如此,但我想实现索引破坏,例如,如果你在while循环中键入“break 2”,那么在另一个while循环中它不仅会从最后一个,但也来自第一个循环(因此在rest后的数字2),依此类推。 例: while 1 while 1 break 2 ‘hello world’!! #will never reach this. “!!” outputs with a newline end ‘hello world again’!! #also will never reach this. again “!!” used for cout end #after break 2 it would jump right here 但由于我没有“反”制表符来检查作用域何时结束(例如C,例如我只使用’}’字符)我想知道这种方法是否最好: 我将在我的yacc文件中定义一个全局变量,如“int tabIndex”,我将使用extern在我的lex文件中访问。 然后每当我在我的lex文件中找到一个制表符时,我会将该变量增加1.当我在yacc文件上解析时,如果我找到一个“break”关键字,我会减去它从tabIndex变量后面输入的数量,以及我编译后到达和EOF,我得到一个tabIndex!= 0我会输出编译错误。 现在的问题是,最好的方法是查看缩进是否减少了,我应该从lex读取\ b(退格)字符然后减少tabIndex变量(当用户不使用break时)? 另一种实现这个的方法? 另外一个小问题,我希望每个可执行文件都有一个名为start()的函数的起点,我应该将其硬编码到我的yacc文件中吗? 对不起,长期以来,我们非常感谢任何帮助。 […]

如何使用Bison / Yacc和递归规则构建数组

有了Bison,我想出了如何将所有内容整合成一个长字符串,如下所示: arg_list: WORD arg_list { strcat( $1, “IFS” ); $$ = strcat($1, $2); } | WORD ; 和: WORD arg_list { printf(“%s, %s\n”, $1, $2); } 但问题是,我将不得不再次在第二条规则中拆分$ 2来解析它。 有没有办法填充数组而不是只使用串联? 我是以错误的方式来做这件事的吗? 如果我需要构建类似于链接列表的东西,这可能是有意义的,只是不确定什么是绑定到arg_list的正确方法,然后清理内存。