gpt4 book ai didi

c - 正则表达式匹配行(换行符除外)(FLEX、BISON)

转载 作者:行者123 更新时间:2023-11-30 15:01:06 28 4
gpt4 key购买 nike

因此,在大学开始我们的编译技术类(class)之前,我们有一个关于 flex、bison 的教程。

以下测试应分为行和换行符

testtest test data
second line in the data
another line without a trailing newline

这是我的解析器应该输出的内容:

Line: testtest test data
NL
Line: second line in the data
NL
Line: another line without a trailing newline

当我运行时

cat test.txt | ./parser 

这将返回:

LINE: testtest test data
It's a bad: syntax error

这是在我的 .y 文件中:

 %{
#include<stdio.h>
int yylex(); /* Supress C99 warning on OSX */
extern char *yytext; /* Correct for Flex */
unsigned int total;

%}
%token LINE
%token NL
%%
line : LINE {printf("LINE: %s\n", yytext);}
;
newline : NL {printf("NL\n");}
;

这是在我的 binary.flex 文件中:

    %top{
#define YYSTYPE int
#include "binary.tab.h" /* Token values generated by bison */
}
%option noyywrap
%%
[^\n\r/]+ return LINE;
\n return NL;
%%

那么,有什么想法可以解决这个问题吗?

PS:这是我的.c 文件

#include<stdio.h>
#include "binary.tab.h"
extern unsigned int total;

int yyerror(char *c)
{
printf("It's a bad: %s\n", c);
return 0;
}

int main(int argc, char **argv)
{
if(!yyparse())
printf("It's a mario time: %d\n",total);
return 0;
}

最佳答案

您的 bison 语法可以准确识别一个 LINE (没有换行符),因为 bison 语法可以识别第一个非终结符。仅此而已,仅此而已。

如果您想识别多行,每行由 LINE 和可能的 NL 组成,您需要为由多行组成的输入添加定义,每个由...组成。不过,我不确定为什么你会使用 bison 来解决这个问题,因为最初的问题似乎只需使用 flex 就很容易解决。

顺便说一句,如果您的输入文件包含 \r 字符,则您的 Flex 模式都不会识别它(Flex 生成的默认规则会捕获它,但这几乎不是您想要的)想)。使用 %option nodefault 以便您收到有关此类错误的警告。当您看到警告时使用react:我确信,当您在 bison 文件上运行 bison 时,您会看到几个警告。

关于c - 正则表达式匹配行(换行符除外)(FLEX、BISON),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41666871/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com