使用 Antlr3.3 解析简单文本

parsing simple text with Antlr3.3

我正在使用 Antlr3.3 中的解析器来解析像 'play bob marley' 或 'search bob marley' 这样的字符串。 解析器应该 return 我使用的关键字('play'、'search'、...)和 return 我给的艺术家。目前它 return 在我的解释器中 'NoViableAltException' 艺术家应该站的地方。

示例.g :

grammar Sample;

@header {
    package a.b.c;
    import java.util.HashMap;
}

@lexer::header {
    package a.b.c;
} 


@members {
}

text returns [String s] :
 wordExp SPACE name
;

wordExp  :
  'play' | 'search' 
;

fragment name  : 
    ( TEXT | DIGIT)* 
;


fragment TEXT : ('a'..'z' | 'A'..'Z');
fragment DIGIT : '0'..'9';

目前显示(输入:'play weezer'):

我试着得到这样的输出:

我使用它已经有一段时间了,我知道里面一定有一个小循环,但我现在还不知道。

你知道这是怎么回事吗?

解析器规则不能是片段:从您的 name 规则中删除 fragment

在我看来你正在尝试做这样的事情:

text
 : wordExp name
 ;

name
 : WORD WORD? // one ore two words
 ;

wordExp
 : PLAY
 | SEARCH
 ;

// Keywords definition _before_ the `WORD` rule!
PLAY   : 'play';
SEARCH : 'search';

WORD : ( 'a'..'z' | 'A'..'Z' )+; // digits in here?

SPACES : ( ' ' | '\t' | '\r' | '\n' )+ {skip();};

请注意,解析如此短的句子会很好,但在 ANTLR(或任何使用某些 (E)BNF 符号的解析器生成器)中解析更接近英语的内容将很困难。在这种情况下,google 用于 NLTK。