我是新手,所以我想知道为什么我需要使用这些指令
%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);
有什么用?
答案 0 :(得分:6)
您当然不需要使用这些选项。如果您不使用相应的功能,则应使用它们,以避免编译器警告。 (如果你不关心编译器警告,你也不需要这些选项。但你应该关心编译器警告:))
很少使用这些功能;如果您想在某些上下文中绕过词法分析,并且直接读取输入(input
),或者您想要制作要扫描的输入文本(unput
),则通常需要它们。
input()
来返回输入流中的下一个字符。 (读取的字符将从输入流中删除,因此在操作完成时不会扫描。)由于input()
仅返回单个字符,因此效率不高,但有时无法避免。一个例子是前面有明确长度的标记。 (总的来说,flex不是词法扫描输入流的理想工具,其中所有令牌都有明确的长度。)
unput(c)
可用于在输入流中插入字符,以便在操作完成时扫描字符。 Flex手册包含a rather contrived example,其中刚刚读取的令牌被重新插入到括号括起的输入流中。
您不应该使用unput
简单地重新扫描全部或部分令牌; yyless
宏为此目的提高效率。
大多数词汇扫描程序不需要input
或unput
,因此通常使用%option
来避免为它们生成代码。
如果您只是学习flex,我建议您从正常的弹性习语开始,将input
和unput
之类的东西放在一边,直到您明确需要它们(如果有的话)。另外,您应该阅读Flex manual,它将回答您的许多问题。