我找不到错误无法识别规则的解决方案
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
规则肯定会匹配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");}
(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
规则肯定会匹配0
或1
,而且它出现得更早在文件中。 (重要的是 规则 的顺序,而不是定义。这是由于不必要地使用定义而导致的另一种可能的混淆。)