Tag: flex lexer

使用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 […]

使用Flex检测和跳过行注释

如何在Flex中检测到像“//”这样的一行注释并跳过此行? 并且: 如果使用下面的“/ *”注释即可。 它会起作用吗? “/*” { comment(); } %% comment() { char c, c1; loop: while ((c = input()) != ‘*’ && c != 0) putchar(c); if ((c1 = input()) != ‘/’ && c != 0) { unput(c1); goto loop; } if (c != 0) putchar(c1); }

加载外部文件flex bison – yyin?

我正在写flex + bison的基本语言,用于我自己的个人研究/运行简单的脚本以获得乐趣。 它通过命令行获取用户输入,解析它,并执行所需的结果。 我想添加function加载文件。 例如,当“加载文件’somefile.src’”文件被加载并自动解析时,解析器就会切换回等待命令行输入。 我无法理解文档而且很丢失。 我不熟悉flex,bison和C作为一个整体。 我正在关注这个pdf: http : //epaperpress.com/lexandyacc/ (使用复杂的计算器作为骨架并在其上添加function)以及查看bison文档http://www.gnu.org/software /bison/manual/bison.html 。 任何意见,将不胜感激。

从flex / bison中释放strdup()中分配的字符串

我有使用strdup()复制字符串lexeme的flex代码。 %{ #include “json.tab.h” #define YY_DECL extern “C” int yylex() %} %option noyywrap %% [ \t\n]+ ; \”[a-zA-Z]+\” {yylval.sval = strdup(yytext); return STRING; } [0-9]+ {yylval.ival = atoi(yytext); return NUMBER; } . {return yytext[0];} ; %% strdup()分配内存并将输入字符串复制到其中并返回( strdup() – 它在C中做了什么? ),所以我想我需要在我不再需要它时将其释放。 从这篇文章: 什么是在BISON中调用%析构函数? ,我添加了%destructor { free($$); printf(“free”);} STRING %destructor { free($$); printf(“free”);} STRING yacc文件中的%destructor { […]

在lex中如何使yyin指向yacc中具有main函数的文件?

我将传递给yacc中main的参数存储在一个文件中。 现在我希望lex从这个文件而不是终端读取它的输入。 我知道我可以将yyin指向yyin yyin = fopen(“fn”,”r”); 但这只适用于主要是在lex中。 当我在yacc的main中使用这个yyin声明时,它显示错误,所以请提出一些建议来克服这个问题。

为什么这个野牛代码会产生意想不到的输出?

flex代码: 1 %option noyywrap nodefault yylineno case-insensitive 2 %{ 3 #include “stdio.h” 4 #include “tp.tab.h” 5 %} 6 7 %% 8 “{” {return ‘{‘;} 9 “}” {return ‘}’;} 10 “;” {return ‘;’;} 11 “create” {return CREATE;} 12 “cmd” {return CMD;} 13 “int” {yylval.intval = 20;return INT;} 14 [a-zA-Z]+ {yylval.strval = yytext;printf(“id:%s\n” , yylval.strval);return ID;} 15 […]