compiler-construction - %option noinput nounput : what are they for?

标签 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: 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宏为此目的更有效。

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

如果你只是在学习 flex,我建议你从普通的 flex 习语开始,留下诸如 input 之类的东西。和 unput放在一边,直到您明确需要它们(如果有的话)。另外,您应该阅读 Flex manual ,这将回答您的许多问题。

关于compiler-construction - %option noinput nounput : what are they for?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39075510/

相关文章:

c++ - 非模板类与模板类的多重定义

compiler-construction - 编译器输出语言 - LLVM IR vs C

Bison 目标的 CMake 自定义命令

c - 用户在 flex 中输入后显示消息

php - 构建一个逐字符读取的词法分析器?

python - 从解析器控制 Python PLY 词法分析器状态

c - 在目标文件上使用 binutils size 给出的大小小于目标文件的实际大小

c# - C# 语句可以生成非连接的 MSIL

c - 字符串输入到 flex 词法分析器