在 lex 中,我可以为 . 之间定义的方程定义以下起始条件$...$
。
%x EQN1
\$ { BEGIN(EQN1); }
<EQN1>{
\$ { BEGIN(INITIAL); }
[^\$]* {}
}
对于 之间的方程式$$...$$
,我如何定义除$$
规则之外的任何内容,例如在[^\$]*
. 估计[^\$\$]*
行不通
在 lex 中,我可以为 . 之间定义的方程定义以下起始条件$...$
。
%x EQN1
\$ { BEGIN(EQN1); }
<EQN1>{
\$ { BEGIN(INITIAL); }
[^\$]* {}
}
对于 之间的方程式$$...$$
,我如何定义除$$
规则之外的任何内容,例如在[^\$]*
. 估计[^\$\$]*
行不通
我认为您不了解模式的匹配方式,请参阅 flex手册
Flex 总是尽量匹配最长的输入。您可以这样理解,更长的规则具有更高的优先级。
因为“\$\$”匹配两个字符和“.” 只有一个,下面的例子就可以了。
%x EQN2
\$\$ { BEGIN(EQN2); }
<EQN2>{
\$\$ { BEGIN(INITIAL); }
. {}
}
您也可以在您的示例中替换[^\$]* {}
为. {}
,因为当规则匹配相同大小的输入时,lex.l 中的第一个具有更高的优先级。