首页 > 解决方案 > 使用 antlr4 进行条件解析 - 跳过输入

问题描述

我有一个要使用 antlr4 解析的字符串,如果特定输入在字符串中匹配,我需要跳过一个标记。

例如,一个字符串包含数字和字符串,如下所示:

String = "87uuujdhhfj12ooiik56iijtg40jhdksa";

解析输出:

87 uuujdhhfj 
12 ooiik56iijtg   //here 56 is skipped
40 jhdksa

如果字符串在解析时匹配 12,那么我需要从解析中跳过接下来的 12 个(除 12 之外的任何值都可以)字符。

对此类解析的任何引用或代码都会有所帮助。

标签: javaantlrantlr4

解决方案


在词法分析器中处理这个需要一个谓词

lexer grammar TLexer;

@members {
  int charsToConsume = 0;
}

TOKEN
 : ( {charsToConsume-- > 0}? [a-zA-Z0-9] )+
 | [a-zA-Z]+
 ;

INT
 : [0-9]+ {
     int n = Integer.parseInt(getText());
     if (n == 12) {
       this.charsToConsume = 12;
     }
   }
 ;

你和班级一起跑的:

import org.antlr.v4.runtime.*;

public class Main {

  public static void main(String[] args) {

    String source = "87uuujdhhfj12ooiik56iijtg40jhdksa";

    TLexer lexer = new TLexer(CharStreams.fromString(source));
    CommonTokenStream tokens = new CommonTokenStream(lexer);

    tokens.fill();

    for (Token t : tokens.getTokens()) {
      System.out.printf("%-15s '%s'\n", TLexer.VOCABULARY.getSymbolicName(t.getType()), t.getText());
    }
  }
}

并将打印:

INT             '87'
TOKEN           'uuujdhhfj'
INT             '12'
TOKEN           'ooiik56iijtg'
INT             '40'
TOKEN           'jhdksa'
EOF             '<EOF>'

推荐阅读