Получение «постороннего ввода», ожидающего {<EOF>, WS} »каждый раз при попытке изменить правило в грамматике Lucene Antlr4 - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь изменить простое правило в этой Lucene Antlr грамматике

Я хочу изменить правила повышения и нечеткости, чтобы иметь обязательную последовательность символов перед CARAT илиОпределения TILDE, но независимо от того, что я пытаюсь, я всегда получаю ошибку «Посторонний ввод», ожидающий {, WS} »при тестировании сгенерированного синтаксического анализатора и лексера на моем языке вывода (в моем случае C #).

Я попытался определить правило лексера, которое будет соответствовать всем буквам и некоторым символам, я попытался использовать некоторые из существующих определений TERM, но оно всегда одно и то же.

Это то, что я пытался в последний раз:

boost :
  normal CARAT NUMBER? ;

fuzzy :
  normal TILDE NUMBER? ;

Может ли кто-то более опытный с Antlr указать мне правильное направление?

Обновление Отладчик Antlr говорит, что запрос типа "test ~ 1" является нормальным (как и ожидалось), но сгенерированный C # код (потому что мой язык вывода - C #) запускает прослушиватель ошибок для каждого запроса, содержащего «~» или «^». Любые идеи будут приветствоваться.

Вот так выглядит мой код C # li

public string FixQueryIfWrong(string query)
{
    var queryWrapper = new StringBuilder(query);

    AntlrInputStream inputStream = new AntlrInputStream(query);
    StandardLuceneGrammarLexer speakLexer = new StandardLuceneGrammarLexer(inputStream);
    CommonTokenStream commonTokenStream = new CommonTokenStream(speakLexer);
    StandardLuceneGrammarParser speakParser = new StandardLuceneGrammarParser(commonTokenStream);
    speakParser.RemoveErrorListeners();
    speakParser.AddErrorListener(new ErrorListener(queryWrapper));
    StandardLuceneGrammarParser.MainQContext mainQContext = speakParser.mainQ();

    return queryWrapper.ToString();
}


internal class ErrorListener : IAntlrErrorListener<IToken>
{
    private StringBuilder _query;
    public ErrorListener(StringBuilder query)
    {
        _query = query;
    }

    public void SyntaxError(TextWriter output, IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
    {
        //... some magic with the query happens here.
    }
}
...