【发布时间】:2021-09-30 14:33:51
【问题描述】:
我正在制作一个使用 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 和正则表达式。任何帮助将不胜感激。
【问题讨论】:
-
由于显示的第 6 行包含
(+|-|*|/)和*是 Lex 元字符,您可能需要对其进行转义 -\*或'*'可能会起作用。 -
我想你会发现
if被识别为一个标识符。另外,我认为输入0.123将被识别为整数0,后跟一个不匹配的.(然后,可能是另一个整数123)。您可能需要稍微重新排序规则。 -
感谢您的回复。我把它改成了 (+|-|*|/) ,但我得到了同样的错误。
-
嗯——想想看,
+不也是另一个 Lex 元字符吗?另外,我在您的评论中看不到您修改后的代码之间的区别。 (在 cmets 内的反引号内引用代码:code输入为…`code`…(或多或少) -
@JonathanLeffler 您对关键字是正确的,但是浮动规则应该可以正常工作,因为浮动规则会产生更长的匹配。数字规则让我感到困惑的是,它们只识别行首的数字,但这看起来是故意的(为什么
^会在那里?)。