我是新手,所以我想知道为什么我需要使用这些指令
%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手册包含一个相当人为的示例,其中将刚刚读取的令牌重新插入到括号中的输入流中。
您不应该unput
用来简单地重新扫描令牌的全部或一部分。该yyless
宏是用于这一目的更有效。
大多数词法扫描器不需要input
或unput
,因此通常使用%option
以避免为其生成代码。
如果你刚开始学习柔,我建议你开始与正常弯曲成语,离开之类的东西input
,并unput
放在一旁,直到你对他们有一个明确的需求(如果有的话)。另外,您应该阅读Flex手册,它将回答您的许多问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句