一种行为奇怪的ANTLR语法

zel*_*ell 3 grammar parsing antlr

我不明白为什么下面的antlr语法不会为输入"bb b"生成树,但它会为输入"aa a"生成树

statement
  |
a a a 
Run Code Online (Sandbox Code Playgroud)

你有什么想法吗?谢谢.

grammar Test2;

options {
  language = Java;
}

statement: ( a|b )*;

a: 'a';

b: 'b';

WS: ('\n'|' '|'\t'|'r'|'\f')+ {$channel=HIDDEN;};
Run Code Online (Sandbox Code Playgroud)

任何人都可以在ANTLR IDE eclipse插件中尝试这个插件 http://antlrv3ide.sourceforge.net/

在我的Eclipse中,它确实表现得像我上面报道的那样奇怪.

Bar*_*ers 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;};
Run Code Online (Sandbox Code Playgroud)

然后使用以下类测试解析器:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

生成词法分析器和解析器并编译所有.java源文件后:

java -cp antlr-3.3.jar org.antlr.Tool Test2.g
javac -cp antlr-3.3.jar *.java
Run Code Online (Sandbox Code Playgroud)

您可以使用"a a a"输入来测试解析器:

java -cp .:antlr-3.3.jar Main "a a a"
parsed: a a a
Run Code Online (Sandbox Code Playgroud)

"b b b"作为输入:

java -cp .:antlr-3.3.jar Main "b b b"
parsed: b b b
Run Code Online (Sandbox Code Playgroud)

如您所见,在这两种情况下都没有报告错误,输入将打印回控制台.

我的猜测是你正在使用ANTLRWorks的解释器.别.这是出了名的马车.要么使用ANTLRWorks的调试器(太棒了!),要么使用自己编写的小型测试类(类似于我的Main类).

编辑

请注意,ANTLR IDE Eclipse插件使用ANTLRWorks的解释器AFAIK.