Tag: flex lexer

具有转义字符的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输入相同?

为什么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; […]

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

另一个简单的问题:是否有任何方法可以告诉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等…相关规则要优先考虑而不必编写语法。

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; } . […]

冲突的野牛圈

为了解决悬空的其他问题,我使用了以下解决方案: 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 […]