当前位置:  开发笔记 > 编程语言 > 正文

C与Bison + Flex检查规则文件

如何解决《C与Bison+Flex检查规则文件》经验,为你挑选了1个好方法。

这是我的html.l:

DOC_START       ""|""
DOC_END         ""|""
SPACE           " "
TEXT            .
%%
%%

这是我的html.y:

%{
#include "lex.yy.c"
%}

%%
Doc         : DOC_START Other DOC_END
Other       : TEXT
            | SPACE
%%

这是我的html文件:


foo bar

我正在编译第一个flex文件,在bison文件之后.它给出了has no rules错误.我想检查一下,如果这个文件是一个正确的html文件,如Doc声明中所述.并且预计会给出错误或消息stdout.我们需要做什么?



1> Brian Tompse..:

您没有遵循手册中所示的lex程序规范.

虽然你已经指定了一些正则表达式并给它们命名(在定义部分中),但你没有告诉lex什么时候找到它(在规则部分,你留空).添加一个返回令牌的规则部分,如下所示:

DOC_START       ""|""
DOC_END         ""|""
SPACE           " "
TEXT            .
%%
{DOC_START}     return DOC_START;
{DOC_END}       return DOC_END;
{SPACE}         return SPACE;
{TEXT}          return TEXT;
%%

您的野牛代码未指定来自lex的令牌,因此您需要添加以下内容:

%{
#include "lex.yy.c"
%}
%token DOC_START DOC_END TEXT SPACE
%%
Doc         : DOC_START Other DOC_END
Other       : TEXT
            | SPACE
%%

但是,如果这样做,则在令牌声明之前编译lex代码.要解决此问题,请将include放在文件的底部:

%token DOC_START DOC_END TEXT SPACE
%%
Doc         : DOC_START Other DOC_END
Other       : TEXT
            | SPACE
%%
#include "lex.yy.c"

就快到了...

现在要输出错误消息,我们需要为该yyerror函数提供代码.你想要输出stdout; 我们需要标准的IO库stdio.h:

%{
#include 

void yyerror(const char* s);

%}
%token DOC_START DOC_END TEXT SPACE
%%
Doc         : DOC_START Other DOC_END
Other       : TEXT
            | SPACE
%%

void yyerror(const char* s)
{ 
 fprintf(stdout, "Syntax error: %s\n", s);
}

#include "lex.yy.c"

现在我注意到你的编译器遵循C99标准并发出警告implicit-function-declarations.工具flex和bison有时会生成导致这些警告的代码.这些只是警告而不是错误,可以忽略.如果您不想看到它们,可以将选项-ansi放在gcc编译行上.

您的代码现在将运行 - 我测试了它.

如果你遇到像未定义的主要错误,你还没有提供yacc库(-ly在gcc行上),但你可以输入你自己的主程序:

%{
#include 

void yyerror(const char* s);

%}
%token DOC_START DOC_END TEXT SPACE
%%
Doc         : DOC_START Other DOC_END
Other       : TEXT
            | SPACE
%%

void yyerror(const char* s)
{ 
 fprintf(stdout, "Syntax error: %s\n", s);
}

int main (void)
{
 return(yyparse());
}
#include "lex.yy.c"

现在您将看到它编译并运行,但每个html文件都会给您一个语法错误.这是因为你的野牛语法不正确.您只允许在html文件中使用一个单独的空格或一个单个字符(而不是它们的序列).如果你无法解决这个问题,你需要提出另一个问题 - 或者更仔细地阅读你的老师课堂笔记!

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有