我已经回到基础,尝试理解解析器如何匹配输入行,例如“asdf”,或任何其他混乱的字符,其中没有为此定义规则。
我的词霸:
%{
#include
%}
%%
"\n" {return NEWLINE; }
我的解析器:
%{
#include <stdlib.h>
%}
% token NEWLINE
%%
program:
| program line
;
line: NEWLINE
;
%%
#include <stdio.h>
int yyerror(char *s)
{
printf("%s\n", s);
return(0);
}
int main(void)
{
yyparse();
exit(0);
}
据我所知,这在编译和运行时应该只接受空白行,但它也允许输入任何字符串而不会出现语法错误。
我错过了什么?
由于
答案 0 :(得分:2)
目前,你的词法分析器会忽略所有非换行符(这是lex中与任何规则不匹配的字符的默认操作),因此解析器只会看到换行符。
通常,您的词法分析器需要对任何/每个可能的输入字符执行某些操作。它可以忽略它们(静默地或带有消息),或者为解析器返回令牌。通常的方法是使最后的词法分析器规则为:
. return *yytext;
匹配任何单个字符(换行符除外)并按原样将其发送到解析器。这是最后一条规则,因此任何与单个字符匹配的早期规则优先,
这完全独立于解析器,它只能看到词法分析器给出的那部分输入。
答案 1 :(得分:1)
您有默认规则。添加选项nodefault以解决您的问题。你的词法分析器将会是这样的:
%option nodefault
%{
#include <stdlib.h>
%}
%%
"\n" {return NEWLINE; }