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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lex / flex规则的格式-模式和动作应该在同一行吗?相关的知识,希望对你有一定的参考价值。

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

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

相对于:

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

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

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

答案

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

以上是关于lex / flex规则的格式-模式和动作应该在同一行吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows、Visual C++ 2008 上安装 LEX/YACC 或 flex/bison

lex.yy.c 如何生成

进一步学习Flex语法 - 自带函数和规则的基本action

Windows环境下lex入门

如何用flex+bison写语法分析器

lex yacc flex bison