<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Техно-логи &#187; vs.net</title>
	<atom:link href="http://www.kurdyukov.com/tag/vsnet/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kurdyukov.com</link>
	<description>Заметки о разработке и прочей жизни</description>
	<lastBuildDate>Wed, 11 Nov 2009 07:55:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>VS.NET: интеграция с ANTLR</title>
		<link>http://www.kurdyukov.com/2009/02/11/vsnet-antlr/</link>
		<comments>http://www.kurdyukov.com/2009/02/11/vsnet-antlr/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 14:19:57 +0000</pubDate>
		<dc:creator>alik</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[antlr]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[vs.net]]></category>

		<guid isPermaLink="false">http://www.kurdyukov.com/?p=16</guid>
		<description><![CDATA[Для разработки парсеров искусственых языков (ИЯ) часто используются различные инструменты генерации. Один из таких инструментов &#8211; ANTLR. Я использовал ANTLR в одном из проектов для разбора 2 специальных ИЯ. Проект делался на C# в среде VS.NET 2008. Среда ANTLRWorks являлась хоть и работающим, но очень неудобным решением.
Недостатки использования ANTLRWorks были в следующем:

Две различные среды для [...]]]></description>
			<content:encoded><![CDATA[<p>Для разработки парсеров искусственых языков (ИЯ) часто используются различные инструменты генерации. Один из таких инструментов &#8211; <a href="http://www.antlr.org/">ANTLR</a>. Я использовал ANTLR в одном из проектов для разбора 2 специальных ИЯ. Проект делался на C# в среде VS.NET 2008. Среда <a href="http://www.antlr.org/works/index.html">ANTLRWorks</a> являлась хоть и работающим, но очень неудобным решением.</p>
<p><span id="more-16"></span>Недостатки использования ANTLRWorks были в следующем:</p>
<ol>
<li>Две различные среды для редактирование кода одного проекта.</li>
<li>Необходимость вручную запускать генерацию кода лексера и парсера при изменении грамматики.</li>
</ol>
<p>Качественное решение должно быть избавлено от этих недостатков.</p>
<p>Для работы с грамматиками ANTLR можно использовать плагин <a href="http://wiki.pixelminegames.com/index.php?title=Tools:nFringe:Antlr">nFringe ANTLR</a>. Плагин распространяется бесплатно и легко устанавливается на VS.NET 2008.</p>
<p>Теперь надо добавить в проект возможность автоматической перегенерации грамматики в процессе компиляции проекта через VS.NET. Делаем следующее:</p>
<p><strong>Подготовка окружения:</strong></p>
<ol>
<li>Убедиться, что на вашем компьютере установлена Java. Достаточно ввести в командной строке &laquo;java -version&raquo;, чтобы это проверить. Если не установлена &#8211; установить.</li>
<li>Установить текущую версию инструмента antlr.jar, он будет использоваться для генерации кода. На момент написания заметки текущая стабильная версия &#8211; 3.1.1. Версия, которая не требует java, существует, но находится в состоянии beta.</li>
<li>Закрыть проект</li>
<li>Найти файл .csproj, который описывает проект</li>
<li>Открыть его на редактирование (например, через notepad)</li>
</ol>
<p><strong>Изменение проекта</strong></p>
<p>Вставить следующий текст перед закрывающим тегом Project:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p16code3'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p163"><td class="code" id="p16code3"><pre class="xml" style="font-family:monospace;">  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ItemGroup<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Antlr3</span> <span style="color: #000066;">Include</span>=<span style="color: #ff0000;">&quot;SimpleCalc.g&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;OutputFiles<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SimpleCalcLexer.cs;SimpleCalcParser.cs<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/OutputFiles<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Antlr3<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Antlr3</span> <span style="color: #000066;">Include</span>=<span style="color: #ff0000;">&quot;BigCalc.g&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;OutputFiles<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>BigCalcLexer.cs;BigCalcParser.cs<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/OutputFiles<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Antlr3<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ItemGroup<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Target</span> <span style="color: #000066;">Name</span>=<span style="color: #ff0000;">&quot;GenerateAntlrCode&quot;</span> <span style="color: #000066;">Inputs</span>=<span style="color: #ff0000;">&quot;@(Antlr3)&quot;</span> <span style="color: #000066;">Outputs</span>=<span style="color: #ff0000;">&quot;%(Antlr3.OutputFiles)&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Exec</span> <span style="color: #000066;">Command</span>=<span style="color: #ff0000;">&quot;java -cp C:\Libs\ANTLR\antlr-3.1.1.jar org.antlr.Tool -message-format vs2005 @(Antlr3)&quot;</span> <span style="color: #000066;">Outputs</span>=<span style="color: #ff0000;">&quot;%(Antlr3.OutputFiles)&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;PropertyGroup<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;BuildDependsOn<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>GenerateAntlrCode;$(BuildDependsOn)<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/BuildDependsOn<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/PropertyGroup<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p><strong>NB!</strong> Нужно заменить названия грамматик и названия выходных файлов, а также правильно указать местоположение файла antlr.jar.</p>
<p>Далее надо добавить зависимости лексера и парсера от грамматики. Находим упоминания файлов SimpleCalcLexer.cs и SimpleCalcParser.cs внутри тега ItemGroup, содержащего упоминания файла AssemblyInfo.cs. Если их нет, значит надо добавить. В результате упоминания этих файлов должны иметь вид:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p16code4'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p164"><td class="code" id="p16code4"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Compile</span> <span style="color: #000066;">Include</span>=<span style="color: #ff0000;">&quot;SimpleCalcLexer.cs&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;AutoGen<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>True<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/AutoGen<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;DesignTime<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>True<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/DesignTime<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;DependentUpon<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SimpleCalc.g<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/DependentUpon<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Compile<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Compile</span> <span style="color: #000066;">Include</span>=<span style="color: #ff0000;">&quot;SimpleCalcParser.cs&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;AutoGen<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>True<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/AutoGen<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;DesignTime<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>True<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/DesignTime<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;DependentUpon<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SimpleCalc.g<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/DependentUpon<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Compile<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Теперь можно открыть проект и убедиться в том, что парсер и лексер будут перегенерированы.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kurdyukov.com/2009/02/11/vsnet-antlr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
