使用 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。
我正在使用 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。