ANTLR的基本行为

时间:2012-06-10 17:50:43

标签: java antlr

我使用以下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
   : (~ ';')+
;

我得到的错误:
第1:0行不匹配的输入'foo'期待'foo'
我希望输入中的空格被忽略,但它不是.. eclipse中的antlr解释器说它很好所以我想我的Java代码不知何故,但我只是看不到它... 注意:如果我删除了SCOLON的规则,那么输入就不会出错。

1 个答案:

答案 0 :(得分:2)

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

请注意您的SCOLON规则:

SCOLON
 : (~ ';')+
 ;

通过其名称建议仅匹配一个分号,但实际上匹配除了分号之外的一个或多个字符。也许应该是这样的:

SCOLON
 : ';'
 ;

修改

  

Heinrich Ody写道:

     

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

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