Java 如何创建动态ANTLR4 lexer规则

Java 如何创建动态ANTLR4 lexer规则,java,antlr4,Java,Antlr4,我有下一个语法 grammar SearchEngine; @lexer::members { private java.util.Set<String> extraCriteria; public SearchEngineLexer(CharStream input, java.util.Set<String> extraCriteria) { this(input); this.extraCriteria = extraCriteria;

我有下一个语法

grammar SearchEngine;

@lexer::members {
  private java.util.Set<String> extraCriteria;

  public SearchEngineLexer(CharStream input, java.util.Set<String> extraCriteria) {
    this(input);
    this.extraCriteria = extraCriteria;
  }
}

query: expression EOF;

expression: criteria operator literal_value | expression 'AND' expression | expression 'OR' expression;

criteria : 'SERVICE_NAME' | ..a lot of hardcoded criterias here | EXTRA_CRITERIA;

EXTRA_CRITERIA: {extraCriteria.stream().filter(c -> c.equals(getText())).findFirst().isPresent()}? . ;
但当我执行这段代码时,我检索

line 1:0 token recognition error at: 'Te'
line 1:2 token recognition error at: 'st'
line 1:4 token recognition error at: 'C'
line 1:5 token recognition error at: 'ri'
line 1:7 token recognition error at: 'te'
line 1:9 token recognition error at: 'ri'
line 1:11 token recognition error at: 'a'
org.antlr.v4.runtime.misc.ParseCancellationException
    at org.antlr.v4.runtime.BailErrorStrategy.recoverInline(BailErrorStrategy.java:66)
    at de.telekom.tvpp.mtool.language.SearchEngineParser.criteria(SearchEngineParser.java:277)
    at de.telekom.tvpp.mtool.language.SearchEngineParser.expression(SearchEngineParser.java:180)
    at de.telekom.tvpp.mtool.language.SearchEngineParser.query(SearchEngineParser.java:117)
    at de.telekom.tvpp.mtool.language.App.main(App.java:22)
Caused by: org.antlr.v4.runtime.InputMismatchException
    at org.antlr.v4.runtime.BailErrorStrategy.recoverInline(BailErrorStrategy.java:61)
    ... 4 more

我错在哪里?如何设置ANTL4以使用动态规则

我的表达有错误。这是我的解决方案:

grammar SearchEngine;


@lexer::members {
  private java.util.Set<String> extraCriteria;

  public SearchEngineLexer(CharStream input, java.util.Set<String> extraCriteria) {
    this(input);
    this.extraCriteria = extraCriteria;
  }

  private boolean isExtraCriteria() {
      return extraCriteria.stream().anyMatch(term -> ahead(term, _input));
  }

  private boolean ahead(final String word, final CharStream input) {
      for (int i = 0; i < word.length(); i++) {
          char wordChar = word.charAt(i);
          int inputChar = input.LA(i + 1);

          if (inputChar != wordChar) {
              return false;
          }
      }

      input.seek(input.index() + word.length() - 1);

      return true;
  }
}

query: expression EOF;

expression: criteria operator literal_value | expression 'AND' expression | expression 'OR' expression;

criteria : 'SERVICE_NAME' | ..a lot of hardcoded criterias here | EXTRA_CRITERIA;

EXTRA_CRITERIA: {isExtraCriteria()}? . ;
语法搜索引擎;
@lexer::成员{
私有java.util.Set extraCriteria;
公共SearchEngineLexer(CharStream输入,java.util.Set extraCriteria){
这(输入);
this.extraCriteria=extraCriteria;
}
私有布尔值isExtraCriteria(){
返回extraCriteria.stream().anyMatch(术语->前置(术语,_输入));
}
前置专用布尔值(最终字符串字、最终字符流输入){
for(int i=0;i
grammar SearchEngine;


@lexer::members {
  private java.util.Set<String> extraCriteria;

  public SearchEngineLexer(CharStream input, java.util.Set<String> extraCriteria) {
    this(input);
    this.extraCriteria = extraCriteria;
  }

  private boolean isExtraCriteria() {
      return extraCriteria.stream().anyMatch(term -> ahead(term, _input));
  }

  private boolean ahead(final String word, final CharStream input) {
      for (int i = 0; i < word.length(); i++) {
          char wordChar = word.charAt(i);
          int inputChar = input.LA(i + 1);

          if (inputChar != wordChar) {
              return false;
          }
      }

      input.seek(input.index() + word.length() - 1);

      return true;
  }
}

query: expression EOF;

expression: criteria operator literal_value | expression 'AND' expression | expression 'OR' expression;

criteria : 'SERVICE_NAME' | ..a lot of hardcoded criterias here | EXTRA_CRITERIA;

EXTRA_CRITERIA: {isExtraCriteria()}? . ;