【问题标题】:How to unlex using Flex(The Fast Lexical Analyzer)?如何使用 Flex(快速词法分析器)进行 unlex?
【发布时间】:2012-05-14 02:56:11
【问题描述】:

有没有办法使用 Flex 将令牌放回输入流?我想像yyunlex()这样的功能。

【问题讨论】:

  • 这是一个与 Adob​​e Flex 相关的问题,还是应该用 gnu-flex 标记?这个问题太缺乏细节了,我说不出来。
  • 将标签从 flex 更改为 gnu-flex。前者指的是Adobe Flex框架,后者指的是快速词法分析器。

标签: flex-lexer lex lexical-analysis


【解决方案1】:

你有几个选择。

您可以使用unput(ch) 将令牌的每个字符放回输入流,其中 ch 是字符。此调用将 ch 作为输入流上的下一个字符(扫描中要考虑的下一个字符)。因此,如果您在令牌匹配期间保存字符串,则可以这样做。

您可能想查看yyless(0),它会将令牌中的所有字符也放回输入流中。不过我从来没有用过这个,所以我不确定是否有任何问题。您可以指定一个整数n,它将把除前 n 个字符之外的所有字符放回输入流中。

现在,如果您要在扫描/解析期间经常这样做,您可能只想使用 lex 来构建标记并将标记放置到您自己的数据结构中进行解析。这类似于 bison 和 yacc 生成的 yyparse() 函数所做的事情。

【讨论】:

  • 因此,如果它对某人有帮助:yyless(0) 可以将您当前的令牌放回输入流。但是再次调用 yyless(0) 是徒劳的——更多的令牌不会被放回输入流中。
【解决方案2】:

有一个宏 REJECT 会将令牌放回流中并继续匹配其他规则,就好像第一个匹配没有一样。如果您只想将一些字符放回流@Kizaru's answer就足够了。

示例 sn-p:

%%
a     |
ab    |
abc   |
abcd  ECHO; REJECT;
.|\n  printf("xx%c", *yytext);
%%

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 2013-12-27
    • 1970-01-01
    • 2011-02-07
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多