Главная > Uncategorized > VS.NET: интеграция с ANTLR

VS.NET: интеграция с ANTLR

Для разработки парсеров искусственых языков (ИЯ) часто используются различные инструменты генерации. Один из таких инструментов – ANTLR. Я использовал ANTLR в одном из проектов для разбора 2 специальных ИЯ. Проект делался на C# в среде VS.NET 2008. Среда ANTLRWorks являлась хоть и работающим, но очень неудобным решением.

Недостатки использования ANTLRWorks были в следующем:

  1. Две различные среды для редактирование кода одного проекта.
  2. Необходимость вручную запускать генерацию кода лексера и парсера при изменении грамматики.

Качественное решение должно быть избавлено от этих недостатков.

Для работы с грамматиками ANTLR можно использовать плагин nFringe ANTLR. Плагин распространяется бесплатно и легко устанавливается на VS.NET 2008.

Теперь надо добавить в проект возможность автоматической перегенерации грамматики в процессе компиляции проекта через VS.NET. Делаем следующее:

Подготовка окружения:

  1. Убедиться, что на вашем компьютере установлена Java. Достаточно ввести в командной строке «java -version», чтобы это проверить. Если не установлена – установить.
  2. Установить текущую версию инструмента antlr.jar, он будет использоваться для генерации кода. На момент написания заметки текущая стабильная версия – 3.1.1. Версия, которая не требует java, существует, но находится в состоянии beta.
  3. Закрыть проект
  4. Найти файл .csproj, который описывает проект
  5. Открыть его на редактирование (например, через 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>

Теперь можно открыть проект и убедиться в том, что парсер и лексер будут перегенерированы.

Categories: Uncategorized Tags: , ,
  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.