我有以下一行:
<INITIAL><<EOF>> {return 0;}
我需要在EOF之前忽略最后一次EOL - \n
或\r\n
。
我无法弄清楚如何将它连接到EOFso它将是一个有效的正则表达式..我已经尝试过:
<INITIAL>((\n)|(\r\n))*<<EOF>> {return 0;}
但它表示这是一个未被承认的规则&#34;。
答案 0 :(得分:3)
<<EOF>>
实际上不是模式符号,因为它不能成为模式的一部分。从逻辑上讲,EOF标记不是一个字符; <<EOF>>
伪模式是唯一可以由空字符串匹配的弹性模式。
没有表示输入结束的弹性模式符号,因此无法表示“后跟EOF”的模式。
因此,您需要从不同的角度进行工作:检测不后跟EOF的模式。
如果某个模式未跟随EOF,则必须后跟至少一个字符。我们可以使用尾随上下文运算符编写。一旦我们匹配了模式的这些实例,只有当匹配 后跟EOF时才能使用模式的任何剩余匹配,因为匹配规则最长:
\r?\n/(.|\n) { /* A new line NOT followed by EOF */ }
\r?\n { /* A new line followed by EOF */ }
我们需要在尾随上下文中使用.|\n
,因为.
与\n
不匹配。由于尾随上下文运算符的优先级,括号是不必要的。
在换行符后强制检测尾随上下文会使此扫描程序的交互使用变得烦人,因为如果第一条规则返回换行符号,则在读取另一行之前实际不会返回它。
顺便说一句,没有必要
<INITIAL><<EOF>> {return 0;}
这是文件结束时的弹性默认行为,如果您需要在返回0之前执行某些操作,则只需要<<EOF>>
规则。