gpt4 book ai didi

java - Antlr 获取子代币

转载 作者:行者123 更新时间:2023-12-01 14:42:48 27 4
gpt4 key购买 nike

如果我的术语有问题,请原谅我。

假设我有一些简化的语法:

// parser
expr : COMPARATIVE;

// lexer
WS : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+;
COMPARATOR
: 'vs'
| 'versus'
;
ITEM
: 'boy'
| 'girl'
;
COMPARATIVE :ITEM WS* COMPARATOR WS* ITEM;

所以这当然会匹配'boy vs girls''girl vs boy'等。但我的问题是当我创建一个词法分析器时,即

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],即它与我的查询很好匹配,但现在我希望能够执行类似的操作,获取当前 token 的子 token 。

我的直觉告诉我我需要使用树,但对于我的示例,我真的不知道如何在 Antlr4 中执行此操作。谢谢

最佳答案

目前,COMPARATIVE 是一个词法分析器规则,这意味着它将尝试从与该规则匹配的所有文本中创建单个标记。相反,您应该制定一个解析器规则比较:

comparative : ITEM WS* COMPARATOR WS* ITEM;

由于 COMPARATIVE 将不再被视为单个 token ,因此您将获得 ITEMWS 的单独 token >比较器

两个旁注:

  1. 如果空格不重要,您可以将其隐藏在解析器规则中,如下所示:

    WS : ('\t' | ' ' | '\r' | '\n'| '\u000C')+ -> channel(HIDDEN);

    然后您可以将您的比较解析器规则简化为:

    comparative : ITEM COMPARATOR ITEM;
  2. 在 ANTLR 4 中,您可以使用新语法简化字符集:

    WS : [ \t\r\n\u000C]+ -> channel(HIDDEN);

关于java - Antlr 获取子代币,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15776494/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com