Я пытаюсь изменить простое правило в этой 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.
}
}