От ANTLR 4.6 до 4.13: снижение эффективности [закрыто] ⇐ C#
-
Anonymous
От ANTLR 4.6 до 4.13: снижение эффективности [закрыто]
У меня есть грамматика C/C++, которая используется в программе C#. Самой грамматикой, к сожалению, поделиться не могу.
Мы использовали собственную общедоступную реализацию ANTLR на C# и получили весьма хорошие результаты. После обновления с этой версии до 4.13.1 (пытаясь придерживаться официальных выпусков, чтобы упростить обслуживание) мы получили огромное снижение времени.
В основном это связано с грамматической двусмысленностью. Мы знаем, что все еще хотим сделать его лучше, но нам удалось уменьшить неоднозначность настолько, что время стало похожим на предыдущие.
Но не всё так хорошо...
Как вы знаете, C/C++ использует директивы C PreProcessor. Хотя мы можем заменить и соблюдать большинство директив препроцессора C, в некоторых ситуациях некоторые макротокены не заменяются.
Сейчас (ANTLR 4.6) парсер восстанавливался (иногда с лучшими результатами, чем другие), но теперь, с ANTLR 4.13.1, восстановление и анализ файла иногда занимает слишком много времени (и в конечном итоге блокируется нашим механизм тайм-аута в три минуты).
Итак, мой вопрос:
[*]Что я могу настроить, кроме того, чтобы сделать грамматику еще менее двусмысленной, чтобы позволить ANTLR восстановиться, но попытаться сделать это быстрее?
ИЗМЕНИТЬ
В итоге выяснилось, что один из двух имеющихся у нас предикатов много раз потреблял входные данные до конца файла. Хотя в версии 4.6 предикат был таким же, новый код восстановления каким-то образом запрашивает его чаще, что приводит к такому поведению.
Закрытие заявки как решение не имеет прямого отношения к алгоритму восстановления ANTLR.
У меня есть грамматика C/C++, которая используется в программе C#. Самой грамматикой, к сожалению, поделиться не могу.
Мы использовали собственную общедоступную реализацию ANTLR на C# и получили весьма хорошие результаты. После обновления с этой версии до 4.13.1 (пытаясь придерживаться официальных выпусков, чтобы упростить обслуживание) мы получили огромное снижение времени.
В основном это связано с грамматической двусмысленностью. Мы знаем, что все еще хотим сделать его лучше, но нам удалось уменьшить неоднозначность настолько, что время стало похожим на предыдущие.
Но не всё так хорошо...
Как вы знаете, C/C++ использует директивы C PreProcessor. Хотя мы можем заменить и соблюдать большинство директив препроцессора C, в некоторых ситуациях некоторые макротокены не заменяются.
Сейчас (ANTLR 4.6) парсер восстанавливался (иногда с лучшими результатами, чем другие), но теперь, с ANTLR 4.13.1, восстановление и анализ файла иногда занимает слишком много времени (и в конечном итоге блокируется нашим механизм тайм-аута в три минуты).
Итак, мой вопрос:
[*]Что я могу настроить, кроме того, чтобы сделать грамматику еще менее двусмысленной, чтобы позволить ANTLR восстановиться, но попытаться сделать это быстрее?
ИЗМЕНИТЬ
В итоге выяснилось, что один из двух имеющихся у нас предикатов много раз потреблял входные данные до конца файла. Хотя в версии 4.6 предикат был таким же, новый код восстановления каким-то образом запрашивает его чаще, что приводит к такому поведению.
Закрытие заявки как решение не имеет прямого отношения к алгоритму восстановления ANTLR.
Мобильная версия