Java Antlr获取子令牌
如果我的术语不通,请原谅 假设我有一点简化的语法:Java Antlr获取子令牌,java,antlr4,Java,Antlr4,如果我的术语不通,请原谅 假设我有一点简化的语法: // parser expr : COMPARATIVE; // lexer WS : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+; COMPARATOR : 'vs' | 'versus' ; ITEM : 'boy' | 'girl' ; COMPARATIVE :ITEM WS* COMPARATOR WS*
// parser
expr : COMPARATIVE;
// lexer
WS : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+;
COMPARATOR
: 'vs'
| 'versus'
;
ITEM
: 'boy'
| 'girl'
;
COMPARATIVE :ITEM WS* COMPARATOR WS* ITEM;
所以这当然会匹配“男孩对女孩”
或“女孩对男孩”
,等等。
但我的问题是,当我创建一个Lexer时
CharStream stream = new ANTLRInputStream("boy vs girl");
SearchLexer lex = new SearchLexer(stream);
CommonTokenStream tokens = new CommonTokenStream(lex);
tokens.fill();
for(Token token : tokens) {
System.out.print(token.getType() + " [" + token.getText() + "] ");
}
这会打印出如下内容:
9[boy vs girl],也就是说,它很好地匹配了我的查询,但是现在我想能够做一些事情,比如,获取当前令牌的子令牌
我的直觉告诉我我需要使用树,但我真的不知道如何在我的例子中使用Antlr4。感谢当前,
COMPARATIVE
是一个lexer规则,这意味着它将尝试从与规则匹配的所有文本中生成一个标记。相反,您应该创建一个解析器规则比较规则:
comparative : ITEM WS* COMPARATOR WS* ITEM;
由于COMPARATIVE
将不再被视为单个令牌,因此您将获得项
、WS
和比较器
的单个令牌
两个旁注:
如果空白不重要,您可以像下面这样从解析器规则中隐藏它:
WS : ('\t' | ' ' | '\r' | '\n'| '\u000C')+ -> channel(HIDDEN);
然后,您可以将比较解析器规则简化为:
comparative : ITEM COMPARATOR ITEM;
在ANTLR 4中,可以使用新语法简化字符集:
WS : [ \t\r\n\u000C]+ -> channel(HIDDEN);
非常感谢,所以让我们假设我有一个名为expr的规则,它实际上匹配了很多东西,比如,expr:(比较的|动作|动词*WS*(位置|项)|连接的|动词*WS*(年龄|性别|时间)|
是否有一种很好的方法来匹配expr,然后轻松解析比较标记?或者我需要识别令牌是比较的,然后根据该令牌的文本生成一个令牌流吗!少校,谢谢!我知道您可以在Antlr3中执行此操作,但无法理解Antlr4的语法:)