1

我使用以下 Java 代码来实例化使用 ANTLR 生成的解析器。

package foo;    
public class Test1 {
public static void main(String[] args) throws RecognitionException {
       CharStream stream = new ANTLRStringStream("foo ");
       BugLexer lexer = new BugLexer(stream);
       CommonTokenStream tokenStream = new CommonTokenStream(lexer);
       BugParser parser = new BugParser(tokenStream);
       parser.specification();
    }
}

我的语法:

grammar Bug;
options {
  language = Java;
}
@header {
  package foo;
}
@lexer::header {
  package foo;
}
specification : 
   'foo' EOF 
;  
WS 
   : (' ' | '\t' | '\n' | '\r')+ {$channel = HIDDEN;} 
;
SCOLON
   : (~ ';')+
;

我得到的错误是:
line 1:0 mismatched input 'foo' Expecting 'foo'
我希望输入中的空格被忽略,但它不是.. Eclipse 中的 antlr 解释器说它很好,所以我想我的 Java 代码不知何故是错误的,但我只是没有看到它......注意:如果我删除了SCOLON的规则,那么输入就没有错误。

4

1 回答 1

2

ANTLR 的词法分析器尝试尽可能多地匹配每个标记。因此"foo "被标记为单个标记SCOLON,而不是'foo'- 和WS标记。

请注意,您的SCOLON规则:

SCOLON
 : (~ ';')+
 ;

顾名思义,它只匹配一个分号,但实际上匹配一个或多个除分号以外的字符。也许它应该是这样的:

SCOLON
 : ';'
 ;

?

编辑

海因里希·奥迪写道:

我不知何故认为令牌ANTLR尝试匹配输入有一个优先级(按声明顺序给出)。感谢您的答复。

这是正确的:只要两个(或更多)规则匹配相同数量的字符,首先定义的规则将“获胜”。但是,如果最后定义的规则匹配最多的字符,则它“获胜”。

于 2012-06-10T18:13:56.863 回答