Tag: bison

为什么flex / bison中的多行注释如此回避?

我正在尝试在我的flex(.l)文件中解析C风格的多行注释: %s ML_COMMENT %% … “/*” BEGIN(ML_COMMENT); “*/” BEGIN(INITIAL); [.\n]+ { } 我没有返回任何令牌,我的语法(.y)不以任何方式处理评论。 当我运行我的可执行文件时,我得到一个解析错误: $ ./a.out /* abc def Parse error: parse error $ echo “/* foo */” | ./a.out Parse error: parse error (我的yyerror函数执行printf(“解析错误:%s \ n”),这是冗余错误消息的前半部分来自)。 我可以看到为什么第二个示例失败,因为整个输入是注释,并且由于语法忽略了注释,因此没有语句。 因此输入不是有效的程序。 但是在我完成评论之前,第一部分抛出了一个解析错误。 同样令人困惑: $ ./a.out /* foo */ a = b; Parse error: parse error 在这种情况下,注释在实际有效输入之前关闭(没有注释,解析就好了)。 在解析“a”之后实际发生失败,而不是在尝试解析赋值“a […]

如何在flex和bison中获取令牌的字符串值?

我的.lex文件中有这个令牌: [a-zA-Z0-9]+ { yylval = yytext; return ALPHANUM; } 这个代码在我的.y文件中: Sentence: “Sphere(” ALPHANUM “).” { FILE* file = fopen(“C:/test.txt”, “a+”); char st1[] = “polySphere -name “; strcat(st1, $2); strcat(st1, “;”); fprintf(file,”%s”, st1); fclose(file); } 我尝试编译时遇到此错误: 警告:传递’strcat’的参数2使得指针来自整数而没有强制转换 所以2美元是一个int,我怎么把它变成一个字符串? 例如:“Sphere(worldGlobe)。” 我希望$ 2在这里有字符串值worldGlobe。 谢谢你的帮助

重入Flex和Bison的问题

我正在学习如何一起使用可重入的Bison和Flex。 我已经有一个简单的计算器工作,没有可重入的function。 但是,当我激活可重入function并进行必要的修改时,我无法使其工作。 这是代码: scanner.l %{ #include #include “parser.tab.h” %} %option 8bit reentrant bison-bridge %option warn noyywrap nodefault %option header-file=”lex.yy.h” DIGIT [0-9] %% “+” { return ADD; } “-” { return SUB; } “*” { return MUL; } “/” { return DIV; } {DIGIT}+ { *yylval = atof(yytext); return NUM; } \n { return EOL; […]

如何使用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的正确方法,然后清理内存。

冲突的野牛圈

为了解决悬空的其他问题,我使用了以下解决方案: stmt : stmt_matched | stmt_unmatched ; stmt_unmatched : IF ‘(‘ exp ‘)’ stmt | IF ‘(‘ exp ‘)’ stmt_matched ELSE stmt_unmatched ; stmt_matched : IF ‘(‘ exp ‘)’ stmt_matched ELSE stmt_matched | stmt_for | … ; 为了定义关于for循环的语法规则,由于同样的问题,我产生了冲突转移/减少: stmt_for : FOR ‘(‘ exp ‘;’ exp ‘;’ exp ‘)’ stmt ; 我怎么解决这个问题?

Flex / Bison:错误恢复析构函数?

对于包含至少一个项目的逗号分隔列表,我有以下语法: column_expression_list: column_expression { $$ = LinkedList_New(); LinkedListItem *item = LinkedListItem_New($1); LinkedList_add($$, item); } | column_expression_list T_COMMA column_expression { LinkedListItem *item = LinkedListItem_New($3); LinkedList_add($1, item); } ; 但考虑一下: column_expression error $$ = LinkedList_New(); 会泄漏。 有没有一种方法可以设置析构函数,以便何时弹出堆栈?

Flex新线扫描野牛

我想使用相同的flex / bison扫描器/解析器作为解释器并加载要解释的文件。 在这两种情况下,我都无法让换行解析正常工作。 解释器:有一个提示,我可以按ENTER键输入命令终止。 文件:这是一个示例输入文件: – – -切 – – – – – begin( print(“well done”), 1) – – 切 – – – – 所以,第一行和’(’应该被吃掉之后有一个换行符。 在我的scanner.l我有 %% [ \t] { errorLineCol += strlen(yytext); } \n { errorLineNumber++; errorLineCol = 0; } (“-“?[0-9])[0-9]* { errorLineCol += strlen(yytext); yylval = stringToInteger(yytext); return TINTEGER; } ….. 这适用于文件方案,但不适用于解释器。 […]

在函数’yylex’中:’变量’未声明

我正在使用Lexical Analysis 。 为此,我使用Flex ,我获取以下问题。 work.l int cnt = 0,num_lines=0,num_chars=0; // Problem here. %% [” “]+[a-zA-Z0-9]+ {++cnt;} \n {++num_lines; ++num_chars;} . {++num_chars;} %% int yywrap() { return 1; } int main() { yyin = freopen(“in.txt”, “r”, stdin); yylex(); printf(“%d %d %d\n”, cnt, num_lines,num_chars); return 0; } 然后,我使用以下命令,它正常工作,并创建lex.yy.c Rezwans-iMac:laqb-2 rezwan $ flex work.l 然后,我使用以下命令。 Rezwans-iMac:laqb-2 rezwan […]

使用Flex / Bison进行口译的REPL

我为类似C语言编写了一个解释器,使用Flex和Bison作为扫描器/解析器。 它在执行完整的程序文件时工作正常。 现在我正在尝试在解释器中实现REPL以进行交互式使用。 我希望它像Ruby或ML中的命令行解释器一样工作: 显示提示 接受该行的一个或多个陈述 如果表达式不完整 显示继续提示 允许用户继续输入行 当该行以完整表达结束时 回显评估最后一个表达式的结果 显示主要提示 我的语法以top_level生成开始,它代表语言中的单个语句。 词法分析器配置为stdin上的交互模式。 我在全文件和REPL模式下使用相同的扫描仪和语法,因为两个接口没有语义差异。 我的主要评估循环是这样构建的。 while (!interpreter.done) { if (interpreter.repl) printf(prompt); int status = yyparse(interpreter); if (status) { if (interpreter.error) report_error(interpreter); } else { if (interpreter.repl) puts(interpreter.result); } } 除了提示和回显逻辑之外,这种方法很好。 如果用户在一行上输入多个语句,则此循环将打印出多余的提示和表达式。 如果表达式在多行上继续,则此代码不会打印出连续提示。 出现这些问题的原因是提示/回显逻辑的粒度是语法中的top_level语句,但是行读取逻辑在词法分析器中很深。 重构评估循环以处理REPL提示和回显的最佳方法是什么? 那是: 如何每行显示一个提示 如何在正确的时间显示延续提示 如何判断完整表达式何时是一行中的最后一个表达式 (我宁愿不改变扫描仪语言来传递换行标记,因为这会严重改变语法。修改YY_INPUT并在Bison语法中添加一些操作YY_INPUT了。另外,我使用的是Flex 2.5.35版本与Xcode一起发布的Bison 2.3。)

如何在flex和bison中使用C ++?

我有一个学校项目,我们需要使用flex和bison。 我想使用C ++,以便我可以访问我编写的STL和我自己的类。 我们获得了以下Makefile: CC = gcc CFLAGS = -g OBJs = parse.tab.o symtab.o attr.o lex.yy.o default: parser parser: ${OBJs} ${CC} ${CFLAGS} ${OBJs} -o parser -lfl lex.yy.c: scan.l parse.tab.h attr.h flex -i scan.l parse.tab.c: parse.y attr.h symtab.h bison -dv parse.y parse.tab.h: parse.tab.c clean: rm -f parser lex.yy.c *.o parse.tab.[ch] parse.output depend: makedepend -I. *.c scan.l和parse.y有一些初始的flex […]