我无法找到错误无法识别的规则的解决方案

时间:2017-12-27 17:50:15

标签: bison flex-lexer

"lexicale.l", line 13: unrecognized rule
"lexicale.l", line 13: unrecognized rule

第13行

{idf} {printf("indetificateur\n");}

代码是:

%{
    #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");}

1 个答案:

答案 0 :(得分:1)

(F)lex模式不能包含未加引号的空白字符。

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

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

总的来说,我个人认为定义没有用;在大多数情况下(例如这个)没有明显的好处,并且实施中的奇怪可能导致混淆和意外结果。

如果您正在使用flex,并且想要在模式中使用空格,则可以使用(?x:…)包围模式以设置"扩展语法"标志:

idf (?x: [A-Z] ( [0-9a-zA-Z] ( _ )? [0-9a-zA-Z] ) {0,11} )

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