Bison 我能';找不到无法识别的错误规则的解决方案

Bison 我能';找不到无法识别的错误规则的解决方案,bison,flex-lexer,Bison,Flex Lexer,第13行是 "lexicale.l", line 13: unrecognized rule "lexicale.l", line 13: unrecognized rule 代码是: {idf} {printf("indetificateur\n");} (F) lex模式不能包含无引号的空白字符 您的定义bool和定义idf都包含不带引号的空格。您应该从两个定义中删除空白 由于flex解析自己输入文件的方式有一个怪癖,因此在模式定义中报告的语法错误行号不是很准确。特别是,在扩展定义时报告

第13行是

"lexicale.l", line 13: unrecognized rule
"lexicale.l", line 13: unrecognized rule
代码是:

{idf} {printf("indetificateur\n");}
(F) lex模式不能包含无引号的空白字符

您的定义
bool
和定义
idf
都包含不带引号的空格。您应该从两个定义中删除空白

由于flex解析自己输入文件的方式有一个怪癖,因此在模式定义中报告的语法错误行号不是很准确。特别是,在扩展定义时报告错误,而不是在定义时报告错误。同样,在这种情况下,错误通常在扩展错误定义后的行上报告

总的来说,我个人认为定义是无用的;在大多数情况下(如本例)没有明显的好处,实现中的奇怪之处可能会导致混乱和意外结果

如果您正在使用flex,并且希望在模式中使用空格,则可以使用
(?x:…)
围绕模式设置“扩展语法”标志:

顺便说一下,您的
bool
模式
0 | 1
可以更简单地写成
[01]
。但是,除非将规则放在匹配
int
的规则之前,否则它将无法识别任何内容,因为
int
规则肯定会匹配
0
1
,并且它会出现在文件的前面。(重要的是规则的顺序,而不是定义。这是由于不必要地使用定义而导致的另一种可能的混淆。)

%{
    #include "stdio.h"
    #include "stdlib.h"
%}
int [0-9]+
float [0-9]+("."[0-9]+)*
bool 0 | 1
idf [A-Z] ( [0-9a-zA-Z] ( _ )? [0-9a-zA-Z] ) {0,11}
%%
{int} {printf("int\n");}
{float} {printf("float\n");}
{bool} {printf("bool\n");}
{idf} {printf("indetificateur\n");}
.     {printf("erreur\n");}
idf (?x: [A-Z] ( [0-9a-zA-Z] ( _ )? [0-9a-zA-Z] ) {0,11} )