bison:空伪变量

bison:空伪变量,bison,flex-lexer,Bison,Flex Lexer,在cygwin环境中使用flex/bison而不是lex/yacc运行(§4.3)中的示例6时,我得到了意外/缺少的输出 我从下载部分下载并解包。在example6.compile文件中,我将“lex”替换为“flex”,否则保持原样(命令yacc在cygwin上执行exec'/usr/bin/bison'-y“$@”)。然后我运行example6.compile。它运行时没有错误,但有一些警告(见附录)。 然后运行示例6,输入示例文本: zone "." { type hint

在cygwin环境中使用flex/bison而不是lex/yacc运行(§4.3)中的示例6时,我得到了意外/缺少的输出

我从下载部分下载并解包。在example6.compile文件中,我将“lex”替换为“flex”,否则保持原样(命令yacc在cygwin上执行
exec'/usr/bin/bison'-y“$@”
)。然后我运行example6.compile。它运行时没有错误,但有一些警告(见附录)。 然后运行示例6,输入示例文本:

zone "." {
        type hint;
        file "/etc/bind/db.root";
        type hint;
}; 
预期产出为:

A zonefile name '/etc/bind/db.root' was encountered
Complete zone for '.' found
A zonefile name '' was encountered
Complete zone for '' found
实际输出为:

A zonefile name '/etc/bind/db.root' was encountered
Complete zone for '.' found
A zonefile name '' was encountered
Complete zone for '' found
为什么缺少伪变量的值

附录

例6.编译:

flex example6.l
yacc --verbose --debug -d example6.y
cc lex.yy.c y.tab.c -o example6
例6.l:

%{
#include <stdio.h>
#include "y.tab.h"
%}

%%

zone                    return ZONETOK;
file                    return FILETOK;
[a-zA-Z][a-zA-Z0-9]*    yylval=strdup(yytext); return WORD;
[a-zA-Z0-9\/.-]+        yylval=strdup(yytext); return FILENAME;
\"                      return QUOTE;
\{                      return OBRACE;
\}                      return EBRACE;
;                       return SEMICOLON;
\n                      /* ignore EOL */;
[ \t]+                  /* ignore whitespace */;
%%
“warning”
赋值从指针生成不带强制转换的整数应始终视为错误,因为它(几乎)总是错误的

在这种情况下,错误告诉您的是,您试图将指针(strdup的返回值
strdup
,即
char*
)存储为整数(
yylval

当然,
yylval
不应该是整数。在yacc/bison文件序言中的C代码中,包括

#define YYSTYPE char *
但是,这一行不会在yacc/bison生成的头文件中结束。(如果是这样,头文件还将包括
yyerror
的定义,例如,这将导致链接问题,因为可执行文件只能有一个函数定义。)


因此,在包含bison头文件之前,还必须在(f)lex输入文件的序言中包含相同的
#define
(因为该文件中使用了
YYSTYPE
,例如用于声明
yylval
)。有点令人惊讶的是,一些声称是lex和yacc指南的东西却没有做到这一点;你可能想考虑提交一个修复程序。< / P>是的,这就起作用了!注意
#define YYSTYPE char*
必须放在
的上方#在(f)lex文件中包含“y.tab.h”
,它才能正常工作。@matthiash:是的,我应该提到这一点。我现在已经添加了它。