"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");}
答案 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
规则肯定会与0
或1
匹配,并且它会更早出现在文件中。 (重要的是规则的顺序,而不是定义。这是由于不必要地使用定义而产生的另一种可能的混淆。)