VS.NET: интеграция с ANTLR
Для разработки парсеров искусственых языков (ИЯ) часто используются различные инструменты генерации. Один из таких инструментов – ANTLR. Я использовал ANTLR в одном из проектов для разбора 2 специальных ИЯ. Проект делался на C# в среде VS.NET 2008. Среда ANTLRWorks являлась хоть и работающим, но очень неудобным решением.
Недостатки использования ANTLRWorks были в следующем:
- Две различные среды для редактирование кода одного проекта.
- Необходимость вручную запускать генерацию кода лексера и парсера при изменении грамматики.
Качественное решение должно быть избавлено от этих недостатков.
Для работы с грамматиками ANTLR можно использовать плагин nFringe ANTLR. Плагин распространяется бесплатно и легко устанавливается на VS.NET 2008.
Теперь надо добавить в проект возможность автоматической перегенерации грамматики в процессе компиляции проекта через VS.NET. Делаем следующее:
Подготовка окружения:
- Убедиться, что на вашем компьютере установлена Java. Достаточно ввести в командной строке «java -version», чтобы это проверить. Если не установлена – установить.
- Установить текущую версию инструмента antlr.jar, он будет использоваться для генерации кода. На момент написания заметки текущая стабильная версия – 3.1.1. Версия, которая не требует java, существует, но находится в состоянии beta.
- Закрыть проект
- Найти файл .csproj, который описывает проект
- Открыть его на редактирование (например, через notepad)
Изменение проекта
Вставить следующий текст перед закрывающим тегом Project:
<ItemGroup> <Antlr3 Include="SimpleCalc.g"> <OutputFiles>SimpleCalcLexer.cs;SimpleCalcParser.cs</OutputFiles> </Antlr3> <Antlr3 Include="BigCalc.g"> <OutputFiles>BigCalcLexer.cs;BigCalcParser.cs</OutputFiles> </Antlr3> </ItemGroup> <Target Name="GenerateAntlrCode" Inputs="@(Antlr3)" Outputs="%(Antlr3.OutputFiles)"> <Exec Command="java -cp C:\Libs\ANTLR\antlr-3.1.1.jar org.antlr.Tool -message-format vs2005 @(Antlr3)" Outputs="%(Antlr3.OutputFiles)"/> </Target> <PropertyGroup> <BuildDependsOn>GenerateAntlrCode;$(BuildDependsOn)</BuildDependsOn> </PropertyGroup> |
NB! Нужно заменить названия грамматик и названия выходных файлов, а также правильно указать местоположение файла antlr.jar.
Далее надо добавить зависимости лексера и парсера от грамматики. Находим упоминания файлов SimpleCalcLexer.cs и SimpleCalcParser.cs внутри тега ItemGroup, содержащего упоминания файла AssemblyInfo.cs. Если их нет, значит надо добавить. В результате упоминания этих файлов должны иметь вид:
<Compile Include="SimpleCalcLexer.cs"> <AutoGen>True</AutoGen> <DesignTime>True</DesignTime> <DependentUpon>SimpleCalc.g</DependentUpon> </Compile> <Compile Include="SimpleCalcParser.cs"> <AutoGen>True</AutoGen> <DesignTime>True</DesignTime> <DependentUpon>SimpleCalc.g</DependentUpon> </Compile> |
Теперь можно открыть проект и убедиться в том, что парсер и лексер будут перегенерированы.

Свежие комментарии