使用Antlr3.3解析简单文本

时间:2015-03-02 20:21:07

标签: java parsing text antlr

我正在使用Antlr3.3中的解析器解析一个字符串,比如播放bob marley'或者'搜索bob marley'。 解析器应该返回我使用的关键字(' play',' search',...)并返回我给的艺术家。目前它在我的翻译器中返回NoViableAltException'艺术家应该站在哪里。

Sample.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'):

enter image description here

我尝试输出这样的输出:

enter image description here

我已经用了一段时间了,我知道里面必须有一个循环,但我现在不知道。

你知道这有什么用吗?

1 个答案:

答案 0 :(得分:0)

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

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

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表示法的任何解析器生成器)中,很难解析类似于英语的东西。在这种情况下,谷歌为NLTK。