Самый простой способ использовать Antlr4 «в интерактивном режиме» — признать, что операция синтаксического анализа выполняется довольно быстро и что в «теплой» виртуальной машине повторное создание экземпляра синтаксического анализатора также выполняется довольно быстро. Действительно, более чем достаточно быстро, чтобы повторно анализировать весь вводимый текст между каждым нажатием клавиши.
Основная стратегия заключается в том, чтобы из ключевого события получить весь текущий входной текст и обработать его в потоке без отображения. Если обработка не завершится до следующего ключевого события, отмените поток обработки и запустите новый. Когда итерация обработки завершается, установите следующее ключевое событие в буфер (при необходимости) и примените результаты к входному тексту.
Непрерывный поток нажатий клавиш вряд ли будет быстрее 100 мс на одно нажатие клавиши (около 80 слов в минуту). В моей системе повторный простой анализ «страницы» кода редактора с использованием грамматики Java.g4 занимает в среднем около 5 мс. Даже при довольно значительной обработке фоновому потоку редко требуется более 25 мс для завершения. Конечно, YMWV.
Обновить
Если требуется непрерывная обработка потока, а не «интерактивная», то Antlr можно адаптировать для этой цели. Для этого потребуется минимальный настраиваемый лексер, соответствующий интерфейсам Lexer и TokenStream, но ожидающий фактических входных данных в ответ на getCurrentToken()
синтаксического анализатора — основная функция синтаксического анализатора для извлечения следующего токена из лексера.
StreamLexer tokens = new StreamLexer(yourInputStream); // custom lexer
YourParser parser = new YourParser(tokens);
parser.removeErrorListeners(); // remove ConsoleErrorListener
parser.addErrorListener(new YourErrorListener());
parser.setErrorHandler(new YourParserErrorStrategy());
parser.start();
Настоящей грамматики лексера не существует — пользовательский лексер просто оборачивает каждый входной символ как отдельный токен, и правила парсера записываются соответствующим образом.
По сути, это превращает стандартный анализатор Antlr в определяемый грамматикой «Push-Parser». Скорость будет ограничена временем выполнения соответствующих функций парсера или скоростью передачи данных входного потока, в зависимости от того, что медленнее.
Для достижения значительно большей скорости синтаксического анализа, скорее всего, потребуется специально созданный конечный автомат.
person
GRosenberg
schedule
10.09.2015