【问题标题】:how to return something when there is not match in flex(lexer)当flex(lexer)中不匹配时如何返回一些东西
【发布时间】:2012-03-06 00:45:31
【问题描述】:

我正在使用 flex(词法分析器)进行一些词法分析。

我需要的是:

如果没有匹配的规则,则返回一个值以指示发生了这样的事情。

这类似于许多编程语言中switch 控制流结构中的default 语法。

有没有办法做这样的事情?

编辑 1: 参考来自the official doc

If no match is found, then the default rule is executed: 
the next character in the input is considered matched and copied to the standard output. 

但是如何更改默认规则?

【问题讨论】:

    标签: flex-lexer


    【解决方案1】:

    acacia-lex 中通过以下方式完成: Lexer 有 run 方法:

    @Override

    公共无效运行(){

    Token token;
    while ((token = this.findNext()).isFound()) {
        System.out.println("LEXER RES = " + token.toString());
    
    }
    

    }

    当什么都没有找到时,没有默认规则。 Lexer 方法运行刚刚完成它的工作。 要继续进行词法分析,在标记规范的末尾需要标记“DOT”->“.”。因此,如果没有其他标记匹配,DOT 将匹配并且 Lexer run 将继续其工作。

    【讨论】:

      【解决方案2】:

      仅当没有其他规则匹配时才应用默认规则。所以你可以简单地插入你自己的匹配任何单个字符的规则作为最后一条规则:

      .|\n  {  /* Your default action. */ }
      

      它必须放在最后,因为 (F)lex 将优先考虑文件中具有相同匹配项的较早规则。您需要明确提及\n(除非您确定其他规则会匹配它),因为在 (F)lex 中,. 匹配任何字符除了换行符。

      如果您使用的是 Flex,并且您不希望使用默认规则,建议放置

      %option nodefault
      

      进入你的序幕。如果有一些输入可能不匹配任何规则,这将抑制默认规则并产生警告。 (如果您忽略警告,则会为此类输入产生运行时错误。)

      【讨论】:

        猜你喜欢
        • 2015-05-09
        • 1970-01-01
        • 2015-09-17
        • 1970-01-01
        • 1970-01-01
        • 2013-01-26
        • 2016-09-25
        • 2010-10-28
        • 2011-07-02
        相关资源
        最近更新 更多