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

i can't find a solution for the error unrecognized rule

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

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

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

由于 flex 解析它自己的输入文件的方式中的一个怪癖,报告的模式定义中的语法错误的行号不是很准确。特别是定义展开时会报错,定义时不会报错。还有像本例一样,经常会报错定义不正确展开后的行

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

如果您使用的是 flex,并且想在模式中使用空格,则可以用 (?x:…) 包围模式以设置 "eXtended syntax" 标志:

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

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