Compiler construction %选项noinput名词PUT:它们的用途是什么?

Compiler construction %选项noinput名词PUT:它们的用途是什么?,compiler-construction,flex-lexer,lexer,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: w

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

%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中的这些指令到底有什么问题? 在这种情况下,我可以使用这些函数(为什么):


这些选项用于什么?

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

这些功能很少使用;如果您希望在某些上下文中绕过词法分析,直接读取输入(
input
),或者如果您希望生成要扫描的输入文本(
unput
),则最需要这些工具

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

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

您不应该使用
unput
来简单地重新扫描全部或部分令牌;在这方面,
yyless
宏的效率要高得多

大多数词汇扫描程序不需要
输入
取消输出
,因此通常使用
%选项
来避免为它们生成代码


如果您只是在学习flex,我建议您从普通的flex习惯用法开始,将
input
unput
等内容放在一边,直到您明确需要它们(如果有的话)。此外,您还应该阅读,它将回答您的许多问题。

非常感谢您的解释^__^@rici
%选项noinput
有效,但我在flex手册中找不到它。你有什么参考资料吗?@magjac:在“有很多选择……”开头的一段末尾
static void yyunput (int c, register char * yy_bp );
static int input  (void);