我没有发现关于lex规则相对于动作的格式的任何解释(或者我错过了)。这是一个例子:
%%
^([ \r\t])*[abcd][^=].*
{
return TOKEN1;
}
%%
相对于:
%%
^([ \r\t])*[abcd][^=].* {
return TOKEN1;
}
%%
我知道%%必须以新行开头且没有空格。但是,我想了解动作部分。我发现有时候,当动作和模式在不同的行上时,如上例所示,它会抱怨“警告,规则无法匹配”。将它们放在同一行时,将发出此警告。但是,我有一个类似的规则,即使在新的一行上开始执行该操作也不会发出警告。
我正在与Bison一起使用,尽管该事实与问题无关。
5.2规则部分的格式
flex输入的规则部分包含一系列格式如下的规则:
pattern action
模式必须不缩进,并且动作必须在同一行上开始。
如果您喜欢Posix specification for lex,则有类似的要求:
lex源文件中的规则是一个表,其中左列包含正则表达式,而右列包含在识别表达式时要执行的动作(C程序片段)。
ERE action ERE action...
行的扩展正则表达式(ERE)部分应与动作分开一个或多个
<blank>
字符。
<blank>
在“基本定义”卷中定义为空格或制表符。
Posix禁止没有动作的规则行,尽管Flex会允许它们就像动作是;
一样。规则部分中的缩进线通常逐字插入到输出中,但是除非缩进线位于第一个规则之前,否则结果是不确定的。 (Posix只是说undefined; flex在break;
语句之后,在action case子句的末尾复制这些行,因此如果这些行是注释,这将不是问题。但是实际的可执行代码很可能会触发“无法访问”代码”警告,前提是您启用了警告。)
但是,Flex还允许启动条件块,并且在启动条件块内允许缩进模式。在这种情况下,将动作本身放在一行上会导致Flex将其视为模式,而不是插入的代码。