我是新手,所以我想知道为什么我需要使用这些指令
%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);
有什么用?
最佳答案
您当然不需要使用这些选项。如果你不使用相应的函数,你应该使用它们,以避免编译器警告。 (如果你不关心编译器警告,你也不需要这些选项。但你应该关心编译器警告:))
函数很少使用;如果您想在某些上下文中绕过词法分析并直接读取输入( input
),或者如果您想制作要扫描的输入文本( unput
),则最需要它们。input()
可用于操作以从输入流中返回下一个字符。 (从输入流中删除读取的字符,因此在操作完成时不会对其进行扫描。)自 input()
只返回单个字符,效率不高,但有时不可避免。一个例子是前面有显式长度的标记。 (总的来说,flex 不是词法扫描所有标记都具有明确长度的输入流的理想工具。)unput(c)
可用于将字符插入到输入流中,以便在操作完成时扫描该字符。 Flex 手册包含 a rather contrived example刚刚读取的 token 被重新插入到括号中的输入流中。
你不应该使用 unput
简单地重新扫描全部或部分 token ; yyless
宏为此目的更有效。
大多数词法扫描器都不需要 input
或 unput
,因此通常使用 %option
以避免为它们生成代码。
如果你只是在学习 flex,我建议你从普通的 flex 习语开始,留下诸如 input
之类的东西。和 unput
放在一边,直到您明确需要它们(如果有的话)。另外,您应该阅读 Flex manual ,这将回答您的许多问题。
关于compiler-construction - %option noinput nounput : what are they for?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39075510/