%option noinput nounput: 它们有什么作用?

17

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

%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个回答

17

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

这些函数很少被使用;它们主要在以下情况下需要使用:一种是想在某个上下文中绕过词汇分析并直接读取输入(input),另一种是想制造待扫描的输入文本(unput)。

input()可以在动作中用于返回输入流中的下一个字符(读取的字符将从输入流中删除,因此在动作完成时它不会被扫描。)。由于input()仅返回单个字符,因此效率不高,但有时是不可避免的。一个例子是带有显式长度前缀的令牌。(总体而言,flex不是扫描所有令牌都具有显式长度的输入流的理想工具。)

unput(c)可用于将一个字符插入到输入流中,使得该字符在动作完成时将被扫描。Flex手册中包含了一个相当牵强的示例,其中刚刚读取的标记被重新插入到输入流中,用括号括起来。

您不应该使用unput来简单地重新扫描整个或部分令牌;对于这个目的,yyless宏更加高效。

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

如果您刚开始学习 flex,我建议您从普通的 flex 语法开始,将像 inputunput 这样的东西放到您有明确需要时再考虑(如果需要的话)。此外,您应该阅读 Flex 手册,它将回答您的许多问题。


非常感谢您的解释!^__^ - zeroDivider
1
@rici,%option noinput 可以使用,但我在 Flex 手册中找不到它。你有相关的参考资料吗? - magjac
1
@magjac:在选项概述的结尾处,第一个段落以“有许多选项可用…”开头。 - rici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接