2016-08-22 194 views
2

我在这个新的,所以我不知道为什么,我需要使用这些指令%option noinput nounput:它们是干什么用的?

%option nounput 
%option noinput 

是啊,我知道,否则我就会有这些警告:

lex.yy.c:1237:17: warning: ‘yyunput’ defined but not used [-Wunused-function] 
    static void yyunput (int c, register char * yy_bp) 
       ^
lex.yy.c:1278:16: warning: ‘input’ defined but not used [-Wunused-function] 
    static int input (void) 
      ^

什么是真正的这些指令在flex中的问题? 在这种情况下,我可以使用这些功能(什么):

static void yyunput (int c, register char * yy_bp); 
static int input (void); 

是为了什么?

回答

2

你当然不需要使用这些选项。如果不使用相应的函数,则应该使用它们,以避免编译器警告。 (如果你不关心编译器警告,你也不需要这些选项,但是你应该关心编译器警告:))

这些函数很少使用;如果您想要在某些情况下绕过词法分析并直接读取输入(input),或者如果要编译要扫描的输入文本(unput),则它们通常是必需的。

input()可用于一个操作中从输入流返回下一个字符。 (从输入流中删除字符,因此在动作结束时不会被扫描。)由于input()只返回单个字符,所以它不是非常有效,但有时候它是不可避免的。一个例子是以明确长度开头的令牌。 (总体而言,flex并不是理想的工具,可以对所有标记具有明确长度的输入流进行词汇扫描。)

unput(c)可用于在输入流中插入一个字符,以便字符在扫描时该行动结束。 Flex手册包含a rather contrived example,其中刚刚读取的令牌被重新插入到由括号括起来的输入流中。

您不应该使用unput重新扫描全部或部分令牌;为此目的,宏yyless更有效率。

大多数词汇扫描仪不需要inputunput,所以通常使用%option来避免为它们生成代码。

如果您只是学习flex,我建议您先从普通的flex成语开始,将诸如inputunput的东西放在一边,直到您明确需要它们(如果有的话)。此外,你应该阅读Flex manual,这将回答你的许多问题。

+0

非常感谢你的解释!^__ ^ – zeroDivider

相关问题