我使用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.
但是如何更改默认规则?
答案 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将优先考虑文件中具有相同匹配的早期规则。您需要明确提及 如果您使用的是Flex,并且您不希望使用默认规则,建议您使用 进入你的序幕。如果有一些输入可能与任何规则不匹配,那么这将取消默认规则并产生警告。 (如果忽略该警告,将为此类输入生成运行时错误。)\n
(除非您确定某些其他规则会与之匹配),因为在(F)lex中,.
匹配除换行符之外的任何字符。< / p>
%option nodefault