flex / bison的语法规则不起作用

时间:2015-02-11 04:26:16

标签: bison yacc lex

所以我的目标是能够确定输入是否可接受。以下是可接受的输入:

" u"," d"," l"," r"," n"

**Example of valid inputs:**
udlrn
uuuuuuuuuuuu
dunrldd
dddddllll
dldnrrrrrrrrrrr

**Example of invalid inputs:**
abc
abcudlr
xudz
dclrxy

这是我的Flex代码

%%
"u"   return UP;
"d"   return DOWN;
"l"   return LEFT;
"r"   return RIGHT;
"n"   return NONE;
\n    return END;
%%

这是我的野牛代码

%token UP
%token DOWN
%token LEFT
%token RIGHT
%token NONE
%token END

%%
start:   directions END
         { 
             printf("\nParse complete with acceptable input\n"); 
         }
;

directions: direction
            |
            directions direction
;

direction: UP | DOWN | LEFT | RIGHT | NONE
;
%%

但是,当我提供输入时,例如:

  • ldruabc

即使此输入无效,我也会收到解析完成消息。

1 个答案:

答案 0 :(得分:3)

任何与flex代码中的任何模式都不匹配的内容都会回显到stdout并被忽略,因此,就目前的构成而言,任何由单行组成的输入都是可以接受的。

您应该在其他弹性规则之后添加一个包罗万象的规则:

.    return *yytext;

这样,输入中的任何其他字符都将返回到解析器,在那里它将触发语法错误。