除了换行符之外的正则表达式匹配行(FLEX,BISON)

时间:2017-01-15 22:08:13

标签: c bison flex-lexer

因此,在我们开始大学的复习技术课程之前,我们有关于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;
}

1 个答案:

答案 0 :(得分:1)

你的野牛语法恰好只识别一个LINE(没有换行符),因为野牛语法识别出第一个非终结者。就是这样,而不是更多。

如果你想识别多个行,每个行由LINENL组成,你需要为包含多行的输入添加一个定义,每行由......我不知道为什么你会为此使用野牛,因为原来的问题似乎很容易用flex来解决。

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