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

问题描述 投票:0回答:1
"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");}
bison flex-lexer
1个回答
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,并且它出现在文件的前面。 (重要的是规则的顺序,而不是定义。这是由于不必要地使用定义而产生的另一种可能的混淆。)

© www.soinside.com 2019 - 2024. All rights reserved.