如何在ANTLR4中发射一个token?

3
这是我的grammar.g4文件:
FOO: 'x';
BAR: 'y'
  { /* here! */ };

我希望在输入中包含“y”时,能够发出令牌“BAR”和“FOO”。我应该在here!部分写什么?请不要建议重新编写语法,这只是一个测试样例,我的实际情况要复杂得多。

当问题被过度简化时,我经常会回答一个X-Y问题(https://en.wikipedia.org/wiki/XY_problem)。你能解释一下你的真实情况并提供真实的例子吗? - Bart Kiers
@BartKiers请看NEWLINE规则下标记是如何被发出的这里。我需要一个类似的机制,但是非常基础。 - yegor256
1
是的,我知道如何做。我甚至写了你链接的那段代码 ;)。我只是想看看你实际语法中的真实用例。 - Bart Kiers
@BartKiers,世界真小 :) 你能给我一个上面代码的例子吗?有了它,我就能在我的代码中做同样的事情(还有很多其他用户也可以!) - yegor256
1个回答

2
这里是一个快速演示:
grammar T;

@lexer::members {
  private java.util.LinkedList<Token> tokens = new java.util.LinkedList<>();

  @Override
  public Token nextToken() {
    return tokens.isEmpty() ? super.nextToken() : tokens.poll();
  }
}

parse
 : foo bar foo EOF
 ;

foo : FOO;
bar : BAR;

FOO : 'x';
BAR : 'y' {this.tokens.offer(new CommonToken(TLexer.FOO, "x"));};

SPACES : [ \t\r\n] -> skip;

测试使用:

TLexer lexer = new TLexer(CharStreams.fromString("x y"));
TParser parser = new TParser(new CommonTokenStream(lexer));

System.out.println(parser.parse().toStringTree(parser));

这将打印:

(parse (foo x) (bar y) (foo x) <EOF>)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接