因此,在我们开始大学的复习技术课程之前,我们有关于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;
}
答案 0 :(得分:1)
你的野牛语法恰好只识别一个LINE
(没有换行符),因为野牛语法识别出第一个非终结者。就是这样,而不是更多。
如果你想识别多个行,每个行由LINE
和NL
组成,你需要为包含多行的输入添加一个定义,每行由......我不知道为什么你会为此使用野牛,因为原来的问题似乎很容易用flex来解决。
顺便说一句,如果你的输入文件包含一个\r
字符,你的flex模式都不会识别它(flex生成的默认规则会捕获它,但这几乎不是你想要的)。使用%option nodefault
以便您收到有关此类错误的警告。当你看到警告时做出反应:当你在野牛文件上运行野牛时,你会看到几个,我确定。