如何在flex(词法分析器)中不匹配时返回一些东西

时间:2012-03-06 00:45:32

标签: flex-lexer

我使用flex(词法分析器)进行词法分析。

我需要的是:

如果没有匹配的规则,则返回一个值以表明发生了这种情况。

这就像许多编程语言中default控制流结构中的switch语法一样。

有没有办法做这种事情?

编辑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. 

但是如何更改默认规则?

2 个答案:

答案 0 :(得分:0)

acacia-lex中,它按以下方式完成: Lexer运行方法:

@覆盖

public void run(){

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

}

}

如果未找到任何内容,则没有默认规则。 Lexer方法运行刚刚完成它的工作。 要继续lexing,在令牌规范结束时需要令牌“DOT” - > “”。因此,如果没有其他令牌匹配,DOT将匹配并且Lexer run将继续其工作。

答案 1 :(得分:0)

默认规则仅适用于没有其他规则匹配的情况。因此,您只需插入自己的规则,将任何单个字符作为最后一条规则匹配:

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

它必须结束,因为(F)lex将优先考虑文件中具有相同匹配的早期规则。您需要明确提及\n(除非您确定某些其他规则会与之匹配),因为在(F)lex中,.匹配除换行符之外的任何字符。< / p>

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

%option nodefault

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