有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在ANTLR4中发出令牌?

这是我的grammar.g4

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

当输入包含y时,我希望发出标记BARFOO。我应该写什么?请不要建议重写语法,这只是一个测试样本,我的真实案例要复杂得多


共 (1) 个答案

  1. # 1 楼答案

    下面是一个快速演示:

    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>)