我正在使用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'):
我尝试输出这样的输出:
我已经用了一段时间了,我知道里面必须有一个循环,但我现在不知道。
你知道这有什么用吗?
答案 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。