Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Antlr获取子令牌_Java_Antlr4 - Fatal编程技术网

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的语法:)