如何在不允许所有角色的情况下处理Bison Grammar中的换行符?

时间:2011-02-03 16:04:47

标签: grammar bison flex-lexer

我已经回到基础,尝试理解解析器如何匹配输入行,例如“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);
}

据我所知,这在编译和运行时应该只接受空白行,但它也允许输入任何字符串而不会出现语法错误。

我错过了什么?

由于

2 个答案:

答案 0 :(得分:2)

目前,你的词法分析器会忽略所有非换行符(这是lex中与任何规则不匹配的字符的默认操作),因此解析器只会看到换行符。

通常,您的词法分析器需要对任何/每个可能的输入字符执行某些操作。它可以忽略它们(静默地或带有消息),或者为解析器返回令牌。通常的方法是使最后的词法分析器规则为:

.         return *yytext;

匹配任何单个字符(换行符除外)并按原样将其发送到解析器。这是最后一条规则,因此任何与单个字符匹配的早期规则优先,

这完全独立于解析器,它只能看到词法分析器给出的那部分输入。

答案 1 :(得分:1)

您有默认规则。添加选项nodefault以解决您的问题。你的词法分析器将会是这样的:

%option nodefault
%{
    #include <stdlib.h>
%}
%%
"\n" {return NEWLINE; }