正则表达式匹配行,换行符除外(FLEX、BISON)
Regex match lines except linebreaks (FLEX, BISON)
所以在大学开始我们的编译技术课程之前,我们有一个关于 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
这个returns:
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 语法可以识别第一个 non-terminal。仅此而已。
如果您想识别多行,每行由一个 LINE
和可能的 NL
组成,您需要为由多行组成的输入添加一个定义,每行由……不过,我不确定你为什么要为此使用野牛,因为原来的问题似乎很容易用 flex 解决。
顺便说一下,如果您的输入文件包含一个 \r
字符,您的 flex 模式中的 none 会识别它(flex-generated 默认规则会识别它,但那是几乎从来没有你想要的)。使用 %option nodefault
以便您收到有关此类错误的警告。当你看到警告时做出反应:当你 运行 bison 在你的 bison 文件上时,你会看到几个,我敢肯定。
所以在大学开始我们的编译技术课程之前,我们有一个关于 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
这个returns:
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 语法可以识别第一个 non-terminal。仅此而已。
如果您想识别多行,每行由一个 LINE
和可能的 NL
组成,您需要为由多行组成的输入添加一个定义,每行由……不过,我不确定你为什么要为此使用野牛,因为原来的问题似乎很容易用 flex 解决。
顺便说一下,如果您的输入文件包含一个 \r
字符,您的 flex 模式中的 none 会识别它(flex-generated 默认规则会识别它,但那是几乎从来没有你想要的)。使用 %option nodefault
以便您收到有关此类错误的警告。当你看到警告时做出反应:当你 运行 bison 在你的 bison 文件上时,你会看到几个,我敢肯定。