1

我有一个简单的 ANTLR 语法,我已将其简化为基本要素,以证明我遇到的这个问题。我正在使用 ANTLRworks 1.3.1。

grammar sample;

assignment  :  IDENT ':=' NUM ';' ;

IDENT       :  ('a'..'z')+ ;

NUM         :  ('0'..'9')+ ;

WS          :  (' '|'\n'|'\t'|'\r')+ {$channel=HIDDEN;} ;

显然,这个语句被文法所接受:

x := 99;

但这也是:

x := @!$()()%99***;

ANTLRworks 解释器的输出:

ANTLR解释器图
(来源:cs.sierracollege.edu 的 barry

我究竟做错了什么?甚至 ANTLR 附带的其他示例语法(例如 CMinus 语法)也表现出这种行为。

4

1 回答 1

2

如果您查看 ANTLRWorks IDE 的控制台,您会看到很多词法分析器错误。

在命令行上试试:

grammar Sample;

@members {
  public static void main(String[] args) throws Exception {
    ANTLRStringStream in = new ANTLRStringStream("x := @!$()()\%99***;");
    SampleLexer lexer = new SampleLexer(in);
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    SampleParser parser = new SampleParser(tokens);
    parser.assignment();
  }
}

assignment  :  IDENT ':=' NUM ';' ;

IDENT       :  ('a'..'z')+ ;

NUM         :  ('0'..'9')+ ;

WS          :  (' '|'\n'|'\t'|'\r')+ {$channel=HIDDEN;} ;

接着:

// generate parser/lexer
java -cp antlr-3.2.jar org.antlr.Tool Sample.g

// compile
javac -cp antlr-3.2.jar *.java

// run Windows
java -cp .;antlr-3.2.jar SampleParser
// or run *nix/MacOS
java -cp .:antlr-3.2.jar SampleParser

将产生:

line 1:5 no viable alternative at character '@'
line 1:6 no viable alternative at character '!'
line 1:7 no viable alternative at character '$'
line 1:8 no viable alternative at character '('
line 1:9 no viable alternative at character ')'
line 1:10 no viable alternative at character '('
line 1:11 no viable alternative at character ')'
line 1:12 no viable alternative at character '%'
line 1:15 no viable alternative at character '*'
line 1:16 no viable alternative at character '*'
line 1:17 no viable alternative at character '*'
于 2010-04-09T07:25:29.383 回答