当我运行以下语法时:
test : WORD+;
WORD : ('a'..'z')+;
WS : ' '+ {$channel = HIDDEN;};
我输入了“?test”,为什么antlr接受这个作为有效输入?我认为 ('a'..'z') 只会匹配小写字母中的字符?
最佳答案
ANTLR 在使用您发布的语法解析输入字符串 ?test
时确实会产生错误。通常情况下,错误在于 ANTLR 周围使用的工具(不幸的是,我发现 ANTLRWorks 也经常发生这种情况!)。
要自行测试(正确),请创建一个文件 Test.g
:
grammar Test;
test : WORD+;
WORD : ('a'..'z')+;
WS : ' '+ {$channel = HIDDEN;};
和一个文件Main.java
:
import org.antlr.runtime.*;
public class Main {
public static void main(String[] args) throws Exception {
ANTLRStringStream in = new ANTLRStringStream("?test");
TestLexer lexer = new TestLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
TestParser parser = new TestParser(tokens);
parser.test();
}
}
并下载 ANTLR 3.2 JAR 的副本在同一目录中。
现在生成词法分析器和解析器:
java -cp antlr-3.2.jar org.antlr.Tool Test.g
编译所有Java源文件:
javac -cp antlr-3.2.jar *.java
并运行主类:
java -cp .:antlr-3.2.jar Main
(如果您使用的是 Windows,请将 :
替换为 ;
!)
这将产生以下错误消息:
line 1:0 no viable alternative at character '?'
关于lexer - 为什么是 'a' 。 ANTLR 中的 .'z' 匹配 $ 或 £ 等通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3188574/