一种行为奇怪的ANTLR语法

时间:2011-10-30 18:22:03

标签: parsing antlr grammar

我不明白为什么以下的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中,它确实表现得像我上面报道的那样奇怪。

1 个答案:

答案 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的解释器。