为什么我收到以下错误:
无法识别的规则
当我尝试这样做时:
%x CS
" {BEGIN(CS);}
<CS>(.*)<<EOF>> {printf("Error"); exit(0);} *** ERROR:unrecognized rule
<CS>" {BEGIN(INITIAL); return;}
我该如何解决它?
<<EOF>>
只能用作完整的模式。它不是模式元素。它是唯一与任何输入匹配的 (f(lex 模式,这意味着它必须返回 0 或以其他方式安排解析终止。(F(lex 不提供在输入结束时识别模式的机制。这通常不是问题,因为它通常可以通过识别未出现在输入末尾的令牌来处理;一旦识别出这些,任何与模式匹配的令牌都必须在末尾。
虽然这确实提供了一个几乎通用的解决方案,特别是在您的代码段等情况下,甚至还有更简单的解决方案。例如,以下内容将识别带引号的字符串,并为未终止的字符串生成错误。
%x CS
%%
" { BEGIN(CS); }
<CS>[^"n]+ { /* string contents */ }
<CS>" { BEGIN(INITIAL); }
<CS>n |
<CS><<EOF>> { /* error */ }
在这种情况下,我们不允许在字符串中使用换行符,因此未终止的字符串错误可能意味着字符串未在行内完成,或者在遇到换行符之前由文件结尾终止的字符串。这不太可能,因为非空文本文件应始终以换行符结尾,但我们始终需要考虑极端情况。(如果我们想允许多行字符串,我们可以从第一个<CS>
模式中删除对n
的排除。通常我们会添加规则来识别转义序列。