lex / flex规则的格式-模式和动作应该在同一行吗?

问题描述 投票:0回答:1

我没有发现关于lex规则相对于动作的格式的任何解释(或者我错过了)。这是一个例子:

  %%
  ^([ \r\t])*[abcd][^=].* 
              {  
                 return TOKEN1;
              }
  %%

相对于:

  %%
  ^([ \r\t])*[abcd][^=].* {  
                 return TOKEN1;
              }
  %%

我知道%%必须以新行开头且没有空格。但是,我想了解动作部分。我发现有时候,当动作和模式在不同的行上时,如上例所示,它会抱怨“警告,规则无法匹配”。将它们放在同一行时,将发出此警告。但是,我有一个类似的规则,即使在新的一行上开始执行该操作也不会发出警告。

我正在与Bison一起使用,尽管该事实与问题无关。

bison lex flex
1个回答
1
投票

Flex manual

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将其视为模式,而不是插入的代码。

© www.soinside.com 2019 - 2024. All rights reserved.