使用“|”时 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");
我正在制作一个程序,用 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");