Tag: lex

Lex:标识符与整数

我正在尝试创建自己的简单编程语言。 为此,我需要在Lex中插入一些正则表达式。 我正在使用以下正则表达式来匹配标识符和整数。 [a-zA-Z][a-zA-Z0-9]* /* identifier */ return IDENTIFIER; (“+”|”-“)?[0-9]+ /* integer */ return INTEGER; 现在当我检查一个非法的标识符,例如: 0a = 1; 前导零被识别为整数,后跟被识别为标识符的“a”。 而不是这个我希望这个标记’0a’被识别为非法字符。 如何包含此function? 我需要调整什么样的正则表达式?

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

具有转义字符的Flex / Lex编码字符串

我将在某些背景下提到这个问题: flex / lex中字符串文字的正则表达式 我遇到的问题是在我的词法分析器中使用转义字符处理输入,我认为这可能与字符串的编码有关,但我不确定。 这是我在lexer中处理字符串文字的方式: \”(\\.|[^\\”])*\” { char* text1 = strndup(yytext + 1, strlen(yytext) – 2); char* text2 = “text\n”; printf(“value = \n”, text1, text1); printf(“value = \n”, text2, text2); } 这输出如下: value = value = 它似乎将换行符分别视为反斜杠后跟n。 这里发生了什么,如何处理文本与C输入相同?

在开发类似语言的小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文件中吗? 对不起,长期以来,我们非常感谢任何帮助。 […]

是否有可能为规则设定优先级以避免“最长最早”的匹配模式?

另一个简单的问题:是否有任何方法可以告诉flex更喜欢匹配较短事物的规则与匹配较长事物的规则? 我找不到任何关于这方面的好文件。 这就是我需要的原因:我为一个伪语言解析一个文件,其中包含一些与控制指令相对应的关键字。 我希望它们是绝对的优先级,这样它们就不会被解析为表达式的一部分。 我实际上需要这个优先级的东西,因为我不需要为我的项目写一个完整的语法(在我的情况下,因为我对解析的程序执行结构分析,我不需要知道细节,这将是完全矫枉过正的… 。),所以我不能使用精细的语法调整来确保这些块不会被解析成表达式。 任何帮助将不胜感激。 以下是解析文件的示例: If a > 0 Then read(b); Endif c := “If I were…”; While d > 5 Do d := d + 1 Endwhile 我只想收集关于Ifs,Thens,Endifs等的信息……其余对我来说无关紧要。 这就是为什么我喜欢Ifs,Thens等…相关规则要优先考虑而不必编写语法。

从lex和yacc语法生成编译器

我正在尝试生成一个编译器,所以我可以在之后传递给他一个.c文件。 我从http://www.quut.com/c/ANSI-C-grammar-y.html下载了YACC和LEX语法,并将它们命名为clexyacc.l和clexyacc.y 在终端上生成它时我做了: yacc -d clexyacc.y lex clexyacc.l 一切都很好。 当我转到最后一部分时,我得到了一些错误。 最后一部分是:cc lex.yy.c y.tab.c -oclexyacc.exe 但我得到这些错误: y.tab.c:2261:16: warning: implicit declaration of function ‘yylex’ is invalid in C99 [-Wimplicit-function-declaration] yychar = YYLEX; ^ y.tab.c:1617:16: note: expanded from macro ‘YYLEX’ # define YYLEX yylex () ^ y.tab.c:2379:7: warning: implicit declaration of function ‘yyerror’ is invalid in C99 [-Wimplicit-function-declaration] […]

Flex,连续扫描流(来自sockets)。 我是否错过了使用yywrap()的东西?

使用Flex进行模式识别,使用基于套接字的扫描仪(连续流)。 Flex没有找到与’array bounderies’重叠的匹配项。 所以我实现了yywrap()来设置新的数组内容,因为yylex()检测到(它将调用yywrap)。 到目前为止没有成功。 基本上(针对我的问题)这是我的代码: %{ #include #include #include #define BUFFERSIZE 26 /* 0123456789012345678901234 */ char cbuf1[BUFFERSIZE] = “Hello everybody, lex is su”; // Warning, no ‘\0’ char cbuf2[BUFFERSIZE] = “per cool. Thanks! “; char recvBuffer[BUFFERSIZE]; int packetCnt = 0; YY_BUFFER_STATE bufferState1, bufferState2; %} %option nounput %option noinput %% “super” { ECHO; } . […]

如何解决2 + 2和2 ++ 2冲突

在较大的程序中,我给出了以下(flex / bison) 在flex中: pn [\+|\-] dig [0-9]+ exp [e|E]{dig}+ 。 。 。 “+” {printf(“+ detected\n”); return PLUS_SIGN;} {pn}?{dig}+ { printf(“digit detected – %s\n”,yytext); sscanf(yytext, “%d”, (int*)&yylval); return TYPE_INT;} 在野牛: expr: expr PLUS_SIGN expr { $$ = $1 + $3; printf(” $$=%f\n”,$$); } | TYPE_INT { $$ = (int)$1; printf(” $$=%f\n”,$$); } ; 问题是: 当我给2 […]

如何删除以下“隐含的函数声明”警告?

如何使用gcc编译lex文件而不接收以下警告? lex.yy.c: In function `yy_init_buffer’: lex.yy.c:1688: warning: implicit declaration of function `fileno’ lex.l: In function `storeLexeme’: lex.l:134: warning: implicit declaration of function `strdup’ 这些是我包含的库。 %{ #include #include #include #include %} 函数yy_init_buffer不在文件中。 以下是函数storeLexeme。 int storeLexeme() { for (int i = 0; i < count; i++) { char *curr = *(symbolTable + i); if (strcmp(curr, yytext) == […]

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