正则表达式匹配行,换行符除外(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 文件上时,你会看到几个,我敢肯定。