%option noinput nounput:它们用于什么?

时间:2016-08-22 09:12:30

标签: compiler-construction flex-lexer lexer

我是新手,所以我想知道为什么我需要使用这些指令

%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);

有什么用?

1 个答案:

答案 0 :(得分:6)

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

很少使用这些功能;如果您想在某些上下文中绕过词法分析,并且直接读取输入(input),或者您想要制作要扫描的输入文本(unput),则通常需要它们。

可以在操作中使用

input()来返回输入流中的下一个字符。 (读取的字符将从输入流中删除,因此在操作完成时不会扫描。)由于input()仅返回单个字符,因此效率不高,但有时无法避免。一个例子是前面有明确长度的标记。 (总的来说,flex不是词法扫描输入流的理想工具,其中所有令牌都有明确的长度。)

unput(c)可用于在输入流中插入字符,以便在操作完成时扫描字符。 Flex手册包含a rather contrived example,其中刚刚读取的令牌被重新插入到括号括起的输入流中。

您不应该使用unput简单地重新扫描全部或部分令牌; yyless宏为此目的提高效率。

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

如果您只是学习flex,我建议您从正常的弹性习语开始,将inputunput之类的东西放在一边,直到您明确需要它们(如果有的话)。另外,您应该阅读Flex manual,它将回答您的许多问题。