如何在ANTLR4中发出一个标记?

huangapple go评论71阅读模式
英文:

How to emit a token in ANTLR4?

问题

这是我的 grammar.g4 文件:

FOO: 'x';
BAR: 'y'
  { /* 在这里! */ };

我希望在输入中包含 y 时发射标记 BARFOO。在 here! 部分应该写什么?请不要建议重新编写语法,这只是一个测试示例,我的真实情况要复杂得多。

英文:

This is my grammar.g4:

FOO: 'x';
BAR: 'y'
  { /* here! */ };

I want tokens BAR and FOO to be emitted when the input contains y. What should I write in the here! part? Please, don't suggest to rewrite the grammar, this is just a test sample, my real case is much more complex.

答案1

得分: 2

这里是一个快速演示示例:

语法 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] -> 跳过;

使用以下方式进行测试:

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>)
英文:

Here's a quick demo:

grammar T;

@lexer::members {
  private java.util.LinkedList&lt;Token&gt; tokens = new java.util.LinkedList&lt;&gt;();

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

parse
 : foo bar foo EOF
 ;

foo : FOO;
bar : BAR;

FOO : &#39;x&#39;;
BAR : &#39;y&#39; {this.tokens.offer(new CommonToken(TLexer.FOO, &quot;x&quot;));};

SPACES : [ \t\r\n] -&gt; skip;

Test with:

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

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

which will print:

(parse (foo x) (bar y) (foo x) &lt;EOF&gt;)

huangapple
  • 本文由 发表于 2020年10月23日 16:41:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/64496755.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定