为什么我在<>之前编写符号时出错<EOF>?



为什么我收到以下错误:

无法识别的规则

当我尝试这样做时:

%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的排除。通常我们会添加规则来识别转义序列。

最新更新