我不明白为什么以下的antlr语法不会为输入“b b b”生成树 但它为输入“a a a”
生成树statement
|
a a a
你有什么想法吗?谢谢。
grammar Test2;
options {
language = Java;
}
statement: ( a|b )*;
a: 'a';
b: 'b';
WS: ('\n'|' '|'\t'|'r'|'\f')+ {$channel=HIDDEN;};
任何人都可以在ANTLR IDE eclipse插件中尝试这个 http://antlrv3ide.sourceforge.net/
在我的Eclipse中,它确实表现得像我上面报道的那样奇怪。
答案 0 :(得分:5)
它同时识别"a a a"
和"b b b"
。要自行检查,请在statement
规则中添加一些debug-print语句:
grammar Test2;
options {
language = Java;
}
statement: ( a|b )* {System.out.println("parsed: " + $text);};
a: 'a';
b: 'b';
WS: ('\n'|' '|'\t'|'r'|'\f')+ {$channel=HIDDEN;};
然后使用以下类测试解析器:
import org.antlr.runtime.*;
public class Main {
public static void main(String[] args) throws Exception {
Test2Lexer lexer = new Test2Lexer(new ANTLRStringStream(args[0]));
Test2Parser parser = new Test2Parser(new CommonTokenStream(lexer));
parser.statement();
}
}
生成词法分析器&解析器并编译所有.java
源文件:
java -cp antlr-3.3.jar org.antlr.Tool Test2.g
javac -cp antlr-3.3.jar *.java
您可以使用"a a a"
作为输入来测试解析器:
java -cp .:antlr-3.3.jar Main "a a a"
parsed: a a a
并以"b b b"
作为输入:
java -cp .:antlr-3.3.jar Main "b b b"
parsed: b b b
如您所见,在这两种情况下都没有报告错误,输入会打印回控制台。
我的猜测是你正在使用ANTLRWorks的解释器。别。这是出了名的马车。要么使用ANTLRWorks的调试器(太棒了!),要么使用自己编写的小型测试类(类似于我的Main
类)。
请注意,ANTLR IDE Eclipse插件使用ANTLRWorks,AFAIK的解释器。