使用“|”时 lex 中无法识别的规则(或)正则表达式

unrecognized rule in lex when using '|' (or) regex

我正在制作一个程序,用 Lex 识别关键字、标识符、int、float 和运算符,但我总是出错,即使它没有任何问题。下面是我的代码。 (文件名为d.l)

第6行,如果是几个关键字之一,则输出关键字,所以 |用作 or.

的正则表达式
%%
[_a-zA-Z][_a-zA-Z0-9]{0,30} printf("identifier\n");
(if|then|else|end|repeat|read|until|write)  printf("keyword\n");
^[-+]?[0-9]*    printf("integer\n");
^[-+]?[0-9]*[.][0-9]*   printf("float\n");
(+|-|*|/) printf("operator");

当我执行 lex d.l 时,结果是错误信息:

d.l:6: unrecognized rule

我是第一次学习 lex 和正则表达式。任何帮助将不胜感激。

(+|-|*|/) printf("operator");

这里的问题不是你使用|,而是你使用+*/,它们是正则表达式中的特殊字符(但不在字符 classes).

您可以通过转义它们(通过在它们前面加上 \ 前缀或用引号将它们括起来)或使用字符 class 来解决这个问题,这将是最惯用的解决方案。请注意,内部字符 classes - 是具有特殊含义的字符,当它不是字符 class 中的第一项或最后一项时(因此不要将 - 在中间或者转义它)。

所以这些解决方案中的任何一个都可以工作(最后一个是最惯用的):

(\+|-|\*|\/) printf("operator");
("+"|-|"*"|"/") printf("operator");
[-+*/] printf("operator");