改写
问题是运行时问题,而不是编译时问题。
问题是你有两个完全不同的词法分析器。
bar.lex
分析器识别输入中的a
an 并将其作为 TOK_A 返回并忽略其他所有内容。
foo.lex
分析器回显每个字符,但仅此而已。
foo.lex — 如所写
%{
#include "foo.tab.h"
%}
%%
foo.lex — 等效
%{
#include "foo.tab.h"
%}
%%
. { ECHO; }
foo.lex — 必需
%{
#include "foo.tab.h"
%}
%%
. { return *yytext; }
工作代码
这是一些带有诊断打印的工作代码。
foo-lex.l
%%
. { printf("Flex: %d\n", *yytext); return *yytext; }
foo.y
%{
#include <stdio.h>
void yyerror(char *s);
%}
%%
file: 'a' { printf("Bison: got file!\n") }
;
%%
int main(void)
{
yyparse();
}
void yyerror(char *s)
{
fprintf(stderr, "%s\n", s);
}
编译和执行
$ flex foo-lex.l
$ bison foo.y
$ gcc -o foo foo.tab.c lex.yy.c -lfl
$ echo a | ./foo
Flex: 97
Bison: got file!
$
细节点:那个空白行是如何进入输出的?答:词法分析器把它放在那里。该模式.
与换行符不匹配,因此换行符被视为存在规则:
\n { ECHO; }
这就是输入被接受的原因。如果将foo-lex.l
文件更改为:
%%
. { printf("Flex-1: %d\n", *yytext); return *yytext; }
\n { printf("Flex-2: %d\n", *yytext); return *yytext; }
然后重新编译并再次运行,输出为:
$ echo a | ./foo
Flex-1: 97
Bison: got file!
Flex-2: 10
syntax error
$
没有空行。这是因为语法不允许换行符出现在有效的“文件”中。