"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:…)
围绕模式以设置“扩展语法”标志:
idf (?x: [A-Z] ( [0-9a-zA-Z] ( _ )? [0-9a-zA-Z] ) {0,11} )
顺便说一下,你的bool
模式0 | 1
可以更简单地写成简单的[01]
。但是,除非将规则放在与int
匹配的规则之前,否则它将无法识别任何内容,因为int
规则肯定会匹配0
或1
,并且它出现在文件的前面。 (重要的是规则的顺序,而不是定义。这是由于不必要地使用定义而产生的另一种可能的混淆。)