2017-12-27 729 views
0
"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

(F)法图案不能包含未引用的空白字符。

您的定义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,并且它会出现在文件的较早部分。 (这是规则的顺序重要,而不是定义。这是由于不必要地使用定义而导致的另一种可能的混淆。)