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

%option noinput nounput: what are they for?

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

%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() 可用于 return 来自输入流的下一个字符的操作。 (读取的字符从输入流中移除,因此在操作完成时不会扫描它。)由于 input() 只有 return 一个字符,效率不是很高,但有时它会是不可避免的。一个例子是标记前面有明确的长度。 (总的来说,flex 不是词法扫描所有标记都有明确长度的输入流的理想工具。)

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

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

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

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