Цели Antlr4 C# и путь вывода сгенерированных файлов
У меня есть решение c# с файлом грамматики Antlr3, и я пытаюсь перейти на Anltr4. Оказывается, грамматика была легкой частью (она стала лучше, и одна треть размера!). Создание парсера оказалось сложной частью.
в старом решении я просто запустил AntlrWorks для обновления лексера и парсера .cs-файлы при изменении файла грамматики. Лексер и парсер были включены непосредственно в тот же проект, что и грамматика, поэтому структура вокруг парсера могла использовать их напрямую.
с целями Antlr4 для C# я заметил, что (по крайней мере, по умолчанию) выходной путь сгенерированных классов синтаксического анализатора C# находится в промежуточном каталоге, например objDebug. Это означает, что я не могу использовать парсер непосредственно в том же проекте. Должен ли я изменить выходной путь, если я хочу, чтобы созданный источник использовался в моем sln? Разве я не хочу, чтобы это было в моем sln?
Я попытался сделать отдельный проект для генерации парсера, то есть проект содержащий только файл грамматики. Когда этот проект построен с использованием целевых объектов Antlr4, на результирующую сборку можно ссылаться из проектов, нуждающихся в классах синтаксического анализатора. Однако, если этот проект включен в решение, я по-прежнему не получаю intellisense в visual studio, поскольку он основан на исходных файлах для загруженных проектов, поэтому он все еще не вполне используется. Единственный способ заставить его работать правильно-построить, а затем выгрузить проект парсера и иметь другие проекты ссылаются на него как на файл сборки, а не на проект.
EDIT:
после просмотра списка antlr-интересов я нашел этот поток, указывающий, что проблема с intellisense может быть ошибкой Resharpers. Если это так, то мой вопрос заключается в том, как продолжать использовать Antlr4 и Resharper в моем решении? https://groups.google.com/forum#!тема / antlr-обсуждение/QSuJXphaBDg
3 ответов
вы столкнулись с известной ошибкой с ReSharper. Интеграция ANTLR 3 и ANTLR 4 C# build является надежной и использует давно установленные шаблоны, которые Microsoft использует с другими языками и задачами генерации кода. Ваши варианты:
- прекратить использование ReSharper
- получить ReSharper авторов для решения проблемы отсутствия поддержки этой функции, или
- измените цель ANTLR 4, чтобы обойти ограничение в ReSharper, которое введет другие проблемы в сборке, которые могут быть или не могут быть приемлемыми для вашего использования.
Вариант 1, безусловно, наименее дорогой и, скорее всего, обеспечит надежную долгосрочную поддержку ваших проектов.
Я нашел расширение для Resharper:ReSharper.ExternalCode.
совет для Antlr: добавить obj\Debug
в Resharper - > проверка кода - > внешний код и перезагрузить решение.
это работает для меня.
существует простой способ получить лучшее из Antlr 4 и Visual Studio. Вы на правильном пути, имея отдельный проект грамматики и проект реализации, но вам не хватает нескольких шагов.
выполните следующие действия, чтобы заставить Intellisense работать
- в Visual Studio перейдите в меню Сервис - > расширения и обновления и найдите в онлайн-разделе "поддержка языка ANTLR" Сэма Харвелла.
- это делает несколько вещи:
- добавляет шаблоны для комбинированных грамматик.
- Добавляет Подсветку Синтаксиса
- добавляет цель MSBuild для грамматики для создания синтаксического анализатора.
- это делает несколько вещи:
- в вашем решении настройте структуру проекта следующим образом:
- решение
- Проект Грамматику
- ANTLR 4 комбинированная грамматика
- Реализация Проекта
- папка для Ссылки на сгенерированные файлы
- Класс Реализации Прослушивателя
- Проект Грамматику
- решение
- написать и скомпилировать грамматику.
- в папке для ссылок на сгенерированные файлы щелкните правой кнопкой мыши папку и выберите Добавить - > существующий элемент
- перейдите к проекту грамматики\obj\Debug и выберите все сгенерированные файлы синтаксического анализатора.
- этот следующий шаг важен. На кнопку добавить туда немного стрелку. Нажмите стрелку раскрывающегося списка и нажмите "Добавить как ссылку".
- это добавит сгенерированные файлы в проект реализации, используя символическую ссылку вместо прямой копии.
- это дает дополнительное преимущество не удалять и повторно добавлять файлы синтаксического анализатора, если вам нужно изменить грамматику позже.
- Intellisense должен работать теперь для ваших сгенерированных классов синтаксического анализатора, и вы не даже придется отключить ReSharper.