<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://pascalabc.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AlexHit</id>
	<title>Вики проекта PascalABC.NET - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://pascalabc.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AlexHit"/>
	<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/AlexHit"/>
	<updated>2026-04-18T12:32:49Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%A0%D0%BE%D0%BB%D0%B8_%D0%B2_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B5_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0%D0%BC_2011&amp;diff=2251</id>
		<title>Роли в проекте и задания разработчикам 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%A0%D0%BE%D0%BB%D0%B8_%D0%B2_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B5_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0%D0%BC_2011&amp;diff=2251"/>
		<updated>2011-12-21T18:44:11Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Темченко А. А. Соловьев Л. В.&lt;br /&gt;
&lt;br /&gt;
1) Передаточная функция в общем виде (композиция передаточных функций/оператор умножения для передаточных функций/).&lt;br /&gt;
&lt;br /&gt;
2) Функция создания множеств Gen, Kill по квадрике или  базовому блоку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Венцко А.З. &lt;br /&gt;
&lt;br /&gt;
1) парсер языка Pascal и C (при участии  А.Науменко)&lt;br /&gt;
&lt;br /&gt;
1.1)Помогал группе (А.Науменко, К.Пак) в реализации обработчиков узлов грамматики, совместно тестировали работу, отлавливали ошибки (как в грамматике, так и в обработчиках)&lt;br /&gt;
&lt;br /&gt;
2) множества IN[B], OUT[B], gen B, kill B, конструктор классов для достижимых определений (совместно - разработка интерфейса)&lt;br /&gt;
&lt;br /&gt;
3) Создание главного проекта, контроль версий, сборка, объединение всех подпроектов в единый проект, &lt;br /&gt;
проверка работоспособности отдельных модулей. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Владыкин К.В. &lt;br /&gt;
&lt;br /&gt;
1) алгоритм удаления мертвых переменных&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Баштанова Д.С., Найденов С.Г.&lt;br /&gt;
&lt;br /&gt;
1) первичное описание классов синтаксического дерева&lt;br /&gt;
&lt;br /&gt;
2) Инфраструктура visitor'ов&lt;br /&gt;
&lt;br /&gt;
3) абстрактный класс, передаточная функция, класс для достигающих определений&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Науменко А.Е., Пак К.Р.&lt;br /&gt;
&lt;br /&gt;
1) Обработчики грамматики &lt;br /&gt;
&lt;br /&gt;
2) Разбиение на блоки&lt;br /&gt;
&lt;br /&gt;
3) реализация итерационного алгоритма&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пронин А., Бувайло О.&lt;br /&gt;
&lt;br /&gt;
1) Visitor для генерации трехадресного кода. Структура для трехадрессного кода.&lt;br /&gt;
&lt;br /&gt;
2) Квадрики - http://file.qip.ru/file/lbbaZEsQ/GenerateQuadruple.html&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%A0%D0%BE%D0%BB%D0%B8_%D0%B2_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B5_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0%D0%BC_2011&amp;diff=2241</id>
		<title>Роли в проекте и задания разработчикам 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%A0%D0%BE%D0%BB%D0%B8_%D0%B2_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B5_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0%D0%BC_2011&amp;diff=2241"/>
		<updated>2011-12-01T11:03:25Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Темченко А. А. Соловьев Л. В.&lt;br /&gt;
&lt;br /&gt;
1) парсер С&lt;br /&gt;
&lt;br /&gt;
2) Передаточная функция в общем виде (композиция передаточных функций/оператор умножения для передаточных функций/).&lt;br /&gt;
&lt;br /&gt;
3) Функция создания множеств Gen, Kill по квадрике или  базовому блоку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Венцко А.З. &lt;br /&gt;
&lt;br /&gt;
1) парсер языка Pascal&lt;br /&gt;
&lt;br /&gt;
2) множества IN[B], OUT[B], gen B, kill B, конструктор классов для достижимых определений (совместно) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Владыкин К.В. &lt;br /&gt;
&lt;br /&gt;
1) алгоритм удаления мертвых переменных&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Баштанова Д.С., Найденов С.Г.&lt;br /&gt;
&lt;br /&gt;
1) первичное описание классов синтаксического дерева&lt;br /&gt;
&lt;br /&gt;
2) Инфраструктура visitor'ов&lt;br /&gt;
&lt;br /&gt;
3) абстрактный класс, передаточная функция, класс для достигающих определений&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Науменко А.Е., Пак К.Р.&lt;br /&gt;
&lt;br /&gt;
1) Обработчики грамматики &lt;br /&gt;
&lt;br /&gt;
2) Разбиение на блоки&lt;br /&gt;
&lt;br /&gt;
3) реализация итерационного алгоритма&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пронин А., Бувайло О.&lt;br /&gt;
&lt;br /&gt;
1) Visitor для генерации трехадресного кода. Структура для трехадрессного кода.&lt;br /&gt;
&lt;br /&gt;
2) Квадрики - http://file.qip.ru/file/lbbaZEsQ/GenerateQuadruple.html&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=2240</id>
		<title>Интерфейс анализа потока данных</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=2240"/>
		<updated>2011-12-01T10:23:02Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:AlexHit|Венцко Александр Зиновьевич]] 05:50, 29 ноября 2011 (UTC)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using GenerateQuadruple;&lt;br /&gt;
using System.Collections;&lt;br /&gt;
namespace BaseBlocks&lt;br /&gt;
{&lt;br /&gt;
    //структура описывает набор множеств для каждого блока&lt;br /&gt;
    struct DFA&lt;br /&gt;
    {&lt;br /&gt;
        public List&amp;lt;String&amp;gt; IN;&lt;br /&gt;
        public List&amp;lt;String&amp;gt; OUT;&lt;br /&gt;
        public List&amp;lt;String&amp;gt; GEN;&lt;br /&gt;
        public List&amp;lt;String&amp;gt; KILL;&lt;br /&gt;
    }&lt;br /&gt;
    //интерфейс анализа потока данных, по умолчанию все поля открытые, содержит словарь квадрик и список структур для базовых блоков&lt;br /&gt;
    interface IDataFlowAnalysis&lt;br /&gt;
    {&lt;br /&gt;
        //в комментариях представленна идея&lt;br /&gt;
        //public List&amp;lt;DFA&amp;gt; BaseBlockDFA;&lt;br /&gt;
        //public List&amp;lt;String&amp;gt; operatorNames;&lt;br /&gt;
        //Данный метод инициализирует словарь квадрик и список множеств, дл каждого базового блока&lt;br /&gt;
        void DataFlowAnalysisInit(List&amp;lt;BaseBlock&amp;gt; baseBlocks);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://webfile.ru/5698571 Класс в электронном виде]&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=2239</id>
		<title>Интерфейс анализа потока данных</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=2239"/>
		<updated>2011-11-29T05:54:06Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:AlexHit|Венцко Александр Зиновьевич]] 05:50, 29 ноября 2011 (UTC)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using GenerateQuadruple;&lt;br /&gt;
using System.Collections;&lt;br /&gt;
namespace BaseBlocks&lt;br /&gt;
{&lt;br /&gt;
    //структура описывает набор множеств для каждого блока&lt;br /&gt;
    struct DFA&lt;br /&gt;
    {&lt;br /&gt;
        public List&amp;lt;String&amp;gt; IN;&lt;br /&gt;
        public List&amp;lt;String&amp;gt; OUT;&lt;br /&gt;
        public List&amp;lt;String&amp;gt; GEN;&lt;br /&gt;
        public List&amp;lt;String&amp;gt; KILL;&lt;br /&gt;
    }&lt;br /&gt;
    //интерфейс анализа потока данных, по умолчанию все поля открытые, содержит словарь квадрик и список структур для базовых блоков&lt;br /&gt;
    interface IDataFlowAnalysis&lt;br /&gt;
    {&lt;br /&gt;
        List&amp;lt;DFA&amp;gt; BaseBlockDFA;&lt;br /&gt;
        Dictionary&amp;lt;string, Quadruple&amp;gt; QuadrDictionary;&lt;br /&gt;
        //Данный метод инициализирует словарь квадрик и список множеств, дл каждого базового блока&lt;br /&gt;
        void DataFlowAnalysisInit(List&amp;lt;BaseBlock&amp;gt; baseBlocks);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://webfile.ru/5698571 Класс в электронном виде]&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=2238</id>
		<title>Интерфейс анализа потока данных</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=2238"/>
		<updated>2011-11-29T05:51:41Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:AlexHit|Венцко Александр Зиновьевич]] 05:50, 29 ноября 2011 (UTC)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using GenerateQuadruple;&lt;br /&gt;
using System.Collections;&lt;br /&gt;
namespace BaseBlocks&lt;br /&gt;
{&lt;br /&gt;
    //структура описывает набор множеств для каждого блока&lt;br /&gt;
    struct DFA&lt;br /&gt;
    {&lt;br /&gt;
        public List&amp;lt;String&amp;gt; IN;&lt;br /&gt;
        public List&amp;lt;String&amp;gt; OUT;&lt;br /&gt;
        public List&amp;lt;String&amp;gt; GEN;&lt;br /&gt;
        public List&amp;lt;String&amp;gt; KILL;&lt;br /&gt;
    }&lt;br /&gt;
    //интерфейс анализа потока данных, по умолчанию все поля открытые, содержит словарь квадрик и список структур для базовых блоков&lt;br /&gt;
    interface IDataFlowAnalysis&lt;br /&gt;
    {&lt;br /&gt;
        List&amp;lt;DFA&amp;gt; BaseBlockDFA;&lt;br /&gt;
        Dictionary&amp;lt;string, Quadruple&amp;gt; QuadrDictionary;&lt;br /&gt;
        //Данный метод инициализирует словарь квадрик и список множеств, дл каждого базового блока&lt;br /&gt;
        void DataFlowAnalysisInit(List&amp;lt;BaseBlock&amp;gt; baseBlocks);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=2237</id>
		<title>Интерфейс анализа потока данных</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=2237"/>
		<updated>2011-11-29T05:50:49Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:AlexHit|Венцко Александр Зиновьевич]] 05:50, 29 ноября 2011 (UTC)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using GenerateQuadruple;&lt;br /&gt;
using System.Collections;&lt;br /&gt;
namespace BaseBlocks&lt;br /&gt;
{&lt;br /&gt;
    //структура описывает набор множеств для каждого блока&lt;br /&gt;
    struct DFA&lt;br /&gt;
    {&lt;br /&gt;
        public List&amp;lt;String&amp;gt; IN;&lt;br /&gt;
        public List&amp;lt;String&amp;gt; OUT;&lt;br /&gt;
        public List&amp;lt;String&amp;gt; GEN;&lt;br /&gt;
        public List&amp;lt;String&amp;gt; KILL;&lt;br /&gt;
    }&lt;br /&gt;
    //интерфейс андиза потока данных, по умолчанию все поля открытые, содержит словарь квадрик и список структур для базовых блоков&lt;br /&gt;
    interface IDataFlowAnalysis&lt;br /&gt;
    {&lt;br /&gt;
        List&amp;lt;DFA&amp;gt; BaseBlockDFA;&lt;br /&gt;
        Dictionary&amp;lt;string, Quadruple&amp;gt; QuadrDictionary;&lt;br /&gt;
        //Данный метод инициализирует словарь квадрик и список множеств, дл каждого базового блока&lt;br /&gt;
        void DataFlowAnalysisInit(List&amp;lt;BaseBlock&amp;gt; baseBlocks);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=2236</id>
		<title>Интерфейс анализа потока данных</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=2236"/>
		<updated>2011-11-29T05:49:08Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: Новая: using System; using System.Collections.Generic; using System.Linq; using System.Text; using GenerateQuadruple; using System.Collections; namespace BaseBlocks {     //структура ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using GenerateQuadruple;&lt;br /&gt;
using System.Collections;&lt;br /&gt;
namespace BaseBlocks&lt;br /&gt;
{&lt;br /&gt;
    //структура описывает набор множеств для каждого блока&lt;br /&gt;
    struct DFA&lt;br /&gt;
    {&lt;br /&gt;
        public List&amp;lt;String&amp;gt; IN;&lt;br /&gt;
        public List&amp;lt;String&amp;gt; OUT;&lt;br /&gt;
        public List&amp;lt;String&amp;gt; GEN;&lt;br /&gt;
        public List&amp;lt;String&amp;gt; KILL;&lt;br /&gt;
    }&lt;br /&gt;
    //интерфейс андиза потока данных, по умолчанию все поля открытые, содержит словарь квадрик и список структур для базовых блоков&lt;br /&gt;
    interface IDataFlowAnalysis&lt;br /&gt;
    {&lt;br /&gt;
        List&amp;lt;DFA&amp;gt; BaseBlockDFA;&lt;br /&gt;
        Dictionary&amp;lt;string, Quadruple&amp;gt; QuadrDictionary;&lt;br /&gt;
        //Данный метод инициализирует словарь квадрик и список множеств, дл каждого базового блока&lt;br /&gt;
        void DataFlowAnalysisInit(List&amp;lt;BaseBlock&amp;gt; baseBlocks);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2235</id>
		<title>МПОК 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2235"/>
		<updated>2011-11-29T05:48:37Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Роли в проекте и задания разработчикам 2011]]&amp;lt;br\&amp;gt;&lt;br /&gt;
[[Грамматика языка Pascal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка С]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Диаграмма классов синтаксического дерева]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика Pascal + Код]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика C + Код]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Собранный проект с последними изменениями - всем скачать]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://files.mail.ru/KA9Z5M Изменения с пары 27.10.2011]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://webfile.ru/5697190 Компилятор, который строит синтаксическое дерево программы (язык Pascal) 10.11.2011]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://dl.dropbox.com/u/18182279/MSS/dvel.7z Удаление мертвых переменных внутри базового блока 17.11.2011]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Разбиение списка квадрик на базовые блоки]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Интерфейс анализа потока данных]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2234</id>
		<title>МПОК 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2234"/>
		<updated>2011-11-28T11:32:09Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Роли в проекте и задания разработчикам 2011]]&amp;lt;br\&amp;gt;&lt;br /&gt;
[[Грамматика языка Pascal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка С]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Диаграмма классов синтаксического дерева]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика Pascal + Код]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика C + Код]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Собранный проект с последними изменениями - всем скачать]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://files.mail.ru/KA9Z5M Изменения с пары 27.10.2011]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://webfile.ru/5697190 Компилятор, который строит синтаксическое дерево программы (язык Pascal) 10.11.2011]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://dl.dropbox.com/u/18182279/MSS/dvel.7z Удаление мертвых переменных внутри базового блока 17.11.2011]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Разбиение списка квадрик на базовые блоки]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2225</id>
		<title>МПОК 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2225"/>
		<updated>2011-11-10T16:05:22Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Роли в проекте и задания разработчикам 2011]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка Pascal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка С]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Диаграмма классов синтаксического дерева]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика Pascal + Код]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика C + Код]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Собранный проект с последними изменениями - всем скачать]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Разбиение списка квадрик на базовые блоки]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://files.mail.ru/KA9Z5M Изменения с пары 27.10.2011]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://webfile.ru/5659541 Компилятор, который строит синтаксическое дерево программы (язык Pascal) 10.11.2011]&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2224</id>
		<title>МПОК 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2224"/>
		<updated>2011-11-10T16:05:00Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Роли в проекте и задания разработчикам 2011]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка Pascal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка С]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Диаграмма классов синтаксического дерева]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика Pascal + Код]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика C + Код]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Собранный проект с последними изменениями - всем скачать]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Разбиение списка квадрик на базовые блоки]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://files.mail.ru/KA9Z5M Изменения с пары 27.10.2011]&lt;br /&gt;
[http://webfile.ru/5659541 Компилятор, который строит синтаксическое дерево программы (язык Pascal) 10.11.2011]&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B1%D1%80%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%BC%D0%B8_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8_-_%D0%B2%D1%81%D0%B5%D0%BC_%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C&amp;diff=2211</id>
		<title>Собранный проект с последними изменениями - всем скачать</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B1%D1%80%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%BC%D0%B8_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8_-_%D0%B2%D1%81%D0%B5%D0%BC_%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C&amp;diff=2211"/>
		<updated>2011-10-15T08:05:24Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://files.mail.ru/31NYVJ Ссылка на собранный проект  yf на паре 13.10.2011] &lt;br /&gt;
Дальше все модификации надо вносить в него...&lt;br /&gt;
&lt;br /&gt;
Пароль: IT&lt;br /&gt;
[http://webfile.ru/5605435 исправленная версия того, что было сделано на паре 15.10.2011]&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B1%D1%80%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%BC%D0%B8_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8_-_%D0%B2%D1%81%D0%B5%D0%BC_%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C&amp;diff=2209</id>
		<title>Собранный проект с последними изменениями - всем скачать</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B1%D1%80%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%BC%D0%B8_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8_-_%D0%B2%D1%81%D0%B5%D0%BC_%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C&amp;diff=2209"/>
		<updated>2011-10-13T06:38:07Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: Новая: [http://webfile.ru/5600793 Ссылка на собранный проект]  Дальше все модификации надо вносить в него...  Пароль: IT&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://webfile.ru/5600793 Ссылка на собранный проект] &lt;br /&gt;
Дальше все модификации надо вносить в него...&lt;br /&gt;
&lt;br /&gt;
Пароль: IT&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2208</id>
		<title>МПОК 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2208"/>
		<updated>2011-10-13T06:35:45Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Роли в проекте и задания разработчикам 2011]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка Pascal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка С]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Диаграмма классов синтаксического дерева]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Первичное описание классов синтаксического дерева]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика Pascal + Код]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика C + Код]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Собранный проект с последними изменениями - всем скачать]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2203</id>
		<title>Грамматика языка Pascal</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2203"/>
		<updated>2011-10-05T18:40:01Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:AlexHit|Венцко Александр Зиновьевич]] 21:11, 21 сентября 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
'''Грамматика'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
%output=Yacc.cs &lt;br /&gt;
&lt;br /&gt;
%union { &lt;br /&gt;
	 public int iVal; &lt;br /&gt;
	 public double dVal; &lt;br /&gt;
         public string sVal; &lt;br /&gt;
         public ExprNode eVal;&lt;br /&gt;
         public TreeNode tVal;&lt;br /&gt;
         public BlockNode lVal;&lt;br /&gt;
         public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
	 public GreatType dtVal;&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
%using System.IO&lt;br /&gt;
%using Syntax_node_tree&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kDO kVAR kWRITE kWRITELN&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON POINT  &lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER kBOOLEAN&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; operator elsepart&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; listoperator progr &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; ident &lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   :&lt;br /&gt;
	{&lt;br /&gt;
		$$ = new Program(@$);&lt;br /&gt;
	}&lt;br /&gt;
	| defss kBEGIN listoperator kEND &lt;br /&gt;
	{&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
		foreach (Operator oper in $3.list)&lt;br /&gt;
			$$.list.Add(oper);&lt;br /&gt;
	}&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD TEXT!!!&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	} &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BlockOperator(@$);&lt;br /&gt;
		$$.list.Add($1);&lt;br /&gt;
	}&lt;br /&gt;
	|defss defs {&lt;br /&gt;
		$1.list.Add($2);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	|&lt;br /&gt;
	;&lt;br /&gt;
    &lt;br /&gt;
defs : kVAR ident COLON ktype SEMICOLUMN &lt;br /&gt;
	{&lt;br /&gt;
		TipType type;&lt;br /&gt;
		if ($4 == &amp;quot;int&amp;quot;)&lt;br /&gt;
			type = TipType.IntType;&lt;br /&gt;
		else if ($4 == &amp;quot;double&amp;quot;)&lt;br /&gt;
			type = TipType.DoubleType;&lt;br /&gt;
		else if ($4 == &amp;quot;bool&amp;quot;)&lt;br /&gt;
			type = TipType.BoolType;&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			 // Error: unknown type&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new VarDef(@$, $2, type);&lt;br /&gt;
	}&lt;br /&gt;
	;   &lt;br /&gt;
&lt;br /&gt;
ident: ID &lt;br /&gt;
	{&lt;br /&gt;
		if (GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: this name is already used&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = new Ident($1, @1);&lt;br /&gt;
		listVars.Add(Id);&lt;br /&gt;
		$$ = new List&amp;lt;Ident&amp;gt;();&lt;br /&gt;
		$$.Add(Id);&lt;br /&gt;
	}   &lt;br /&gt;
	|ident COLUMN ID &lt;br /&gt;
	{&lt;br /&gt;
		if (GlobalStructures.isNameExists($3))&lt;br /&gt;
		{&lt;br /&gt;
		// Error: this name is already used&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = new Ident($3, @3);&lt;br /&gt;
		listVars.Add(Id);&lt;br /&gt;
		$1.Add(Id);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
    &lt;br /&gt;
listoperator : operator &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BlockOperator(@$);&lt;br /&gt;
		$$.list.Add($1);&lt;br /&gt;
	}&lt;br /&gt;
	| listoperator SEMICOLUMN operator {&lt;br /&gt;
		$1.list.Add($2);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD GREATE TYPE&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL &lt;br /&gt;
	{&lt;br /&gt;
		$$ = &amp;quot;double&amp;quot;;&lt;br /&gt;
	} &lt;br /&gt;
	| kINTEGER &lt;br /&gt;
	{&lt;br /&gt;
		$$ = &amp;quot;int&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	| kBOOLEAN&lt;br /&gt;
	{&lt;br /&gt;
		$$ = &amp;quot;bool&amp;quot; &lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
operator: {}&lt;br /&gt;
	| ID ASSIGN expr &lt;br /&gt;
	{&lt;br /&gt;
		if (!GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Undeclarated identifier&lt;br /&gt;
		}&lt;br /&gt;
        Ident Id = GlobalStructures.getIdentByName($1);&lt;br /&gt;
        $$ = new Assign(Id, $3, @3);&lt;br /&gt;
	}&lt;br /&gt;
	| kWHILE expr kDO operator &lt;br /&gt;
	{&lt;br /&gt;
		if ($2.getType()!=TypType.Boolean)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Óñëîâèå äîëæíî èìåòü ëîãè÷åñêèé òèï&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new While($2, $4, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| kIF expr kTHEN operator elsepart &lt;br /&gt;
	{&lt;br /&gt;
		if ($2.getType()!=TypType.Boolean)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Óñëîâèå äîëæíî èìåòü ëîãè÷åñêèé òèï&lt;br /&gt;
		}&lt;br /&gt;
		$$=new If($2,$4,$5,@$);&lt;br /&gt;
	}&lt;br /&gt;
	| kBEGIN listoperator kEND &lt;br /&gt;
	{&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
	| kWRITE LPAREN expr RPAREN &lt;br /&gt;
	{&lt;br /&gt;
		System.Console.Write($3);&lt;br /&gt;
	}&lt;br /&gt;
	| kWRITELN LPAREN expr RPAREN&lt;br /&gt;
	{&lt;br /&gt;
		System.Console.WriteLine($3);&lt;br /&gt;
	}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: &lt;br /&gt;
	{&lt;br /&gt;
		$$ = null;&lt;br /&gt;
	}&lt;br /&gt;
	| kELSE operator {&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
expr: INTNUM &lt;br /&gt;
	{&lt;br /&gt;
		int i = int.Parse($1);&lt;br /&gt;
		$$ = new IntConst(i, @1);&lt;br /&gt;
	}&lt;br /&gt;
	| REALNUM &lt;br /&gt;
	{&lt;br /&gt;
		double d = double.Parse($1);&lt;br /&gt;
		$$ = new DoubleConst(d, @1);&lt;br /&gt;
	}&lt;br /&gt;
	| STRINGLITERAL &lt;br /&gt;
	{&lt;br /&gt;
		// Íåò ó íàñ òàêèõ!!!&lt;br /&gt;
	}&lt;br /&gt;
	| ID &lt;br /&gt;
	{&lt;br /&gt;
		if (!GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Undeclarated identifier&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new Ident($1, @1);&lt;br /&gt;
	}&lt;br /&gt;
	| expr PLUS expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Plus, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr MINUS expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Minus, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr MULT expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Mult, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr DIVIDE expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Divide, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr DIV expr &lt;br /&gt;
	{&lt;br /&gt;
		// Íå ïîääåðæèâàåòñÿ!&lt;br /&gt;
	}&lt;br /&gt;
	| expr MOD expr &lt;br /&gt;
	{&lt;br /&gt;
		// Íå ïîääåðæèâàåòñÿ!&lt;br /&gt;
	}&lt;br /&gt;
	| expr AND expr &lt;br /&gt;
	{&lt;br /&gt;
		if ($1.getType() != TipType.BoolType || $2.getType() != TipType.BoolType)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: only for bool types&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.And, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr OR expr &lt;br /&gt;
	{&lt;br /&gt;
		if ($1.getType() != TipType.BoolType || $2.getType() != TipType.BoolType)&lt;br /&gt;
		{&lt;br /&gt;
		    // Error: only for bool types&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Or, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr LT expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Less, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr GT expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.More, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr LE expr	&lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.LessEqual, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr GE expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.MoreEqual, @$);       &lt;br /&gt;
	}&lt;br /&gt;
	| expr EQ expr&lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Equal, @$);       &lt;br /&gt;
	}&lt;br /&gt;
	| expr NE expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.NotEqual, @$);        &lt;br /&gt;
	}&lt;br /&gt;
	| NOT expr &lt;br /&gt;
	{&lt;br /&gt;
		if ($2.getType() != TipType.BoolType)&lt;br /&gt;
		{&lt;br /&gt;
		// Error: type is wrong.&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new UnarExpression($2, Op.Not, @2);&lt;br /&gt;
	}&lt;br /&gt;
	| MINUS expr %prec UMINUS &lt;br /&gt;
	{&lt;br /&gt;
		if ($2.getType() != TipType.IntType &amp;amp;&amp;amp; $2.getType() != TipType.DoubleType)&lt;br /&gt;
		{&lt;br /&gt;
		    // Error: type is wrong.&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new UnarExpression($2, Op.Minus, @2);&lt;br /&gt;
	} &lt;br /&gt;
	| LPAREN expr RPAREN &lt;br /&gt;
	{&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Сканер'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%using Syntax_node_tree;&lt;br /&gt;
&lt;br /&gt;
Alpha 	[a-zA-Z_]&lt;br /&gt;
INTNUM  [0-9]+&lt;br /&gt;
REALNUM {INTNUM}\.{INTNUM}&lt;br /&gt;
ID [a-zA-Z_][a-zA-Z0-9_]* &lt;br /&gt;
&lt;br /&gt;
%x COMMENT&lt;br /&gt;
%x COMMENT1&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
&amp;quot;{&amp;quot; { BEGIN(COMMENT);}&lt;br /&gt;
&amp;lt;COMMENT&amp;gt; &amp;quot;}&amp;quot; { BEGIN(INITIAL);}&lt;br /&gt;
&amp;lt;COMMENT&amp;gt; &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt; { Console.WriteLine(&amp;quot;Комментарий не закрыт&amp;quot;);}&lt;br /&gt;
&amp;quot;(*&amp;quot; { BEGIN(COMMENT1);}&lt;br /&gt;
&amp;lt;COMMENT1&amp;gt; &amp;quot;*)&amp;quot; { BEGIN(INITIAL);}&lt;br /&gt;
&amp;lt;COMMENT1&amp;gt; &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt; { Console.WriteLine(&amp;quot;Комментарий не закрыт&amp;quot;);}&lt;br /&gt;
&lt;br /&gt;
&amp;quot;:=&amp;quot; { return (int)Tokens.ASSIGN; }&lt;br /&gt;
&amp;quot;;&amp;quot; { return (int)Tokens.SEMICOLUMN; }&lt;br /&gt;
&amp;quot;-&amp;quot; { return (int)Tokens.MINUS; }&lt;br /&gt;
&amp;quot;+&amp;quot; { return (int)Tokens.PLUS; }&lt;br /&gt;
&amp;quot;*&amp;quot; { return (int)Tokens.MULT; }&lt;br /&gt;
&amp;quot;/&amp;quot; { return (int)Tokens.DIVIDE; }&lt;br /&gt;
&amp;quot;&amp;lt;&amp;quot; { return (int)Tokens.LT; }&lt;br /&gt;
&amp;quot;&amp;gt;&amp;quot; { return (int)Tokens.GT; }&lt;br /&gt;
&amp;quot;&amp;lt;=&amp;quot; { return (int)Tokens.LE; }&lt;br /&gt;
&amp;quot;&amp;gt;=&amp;quot; { return (int)Tokens.GE; }&lt;br /&gt;
&amp;quot;=&amp;quot; { return (int)Tokens.EQ; }&lt;br /&gt;
&amp;quot;&amp;lt;&amp;gt;&amp;quot; { return (int)Tokens.NE; }&lt;br /&gt;
&amp;quot;(&amp;quot; { return (int)Tokens.LPAREN; }&lt;br /&gt;
&amp;quot;)&amp;quot; { return (int)Tokens.RPAREN; }&lt;br /&gt;
&amp;quot;,&amp;quot; { return (int)Tokens.COLUMN; }&lt;br /&gt;
&amp;quot;:&amp;quot; { return (int)Tokens.COLON; }&lt;br /&gt;
&amp;quot;.&amp;quot; { return (int)Tokens.POINT;  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\'[^']*\' {&lt;br /&gt;
  yylval.sVal = yytext.Substring(1,yytext.Length-2);&lt;br /&gt;
  return (int)Tokens.STRINGLITERAL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{ID}  { &lt;br /&gt;
  int res = ScannerHelper.GetIDToken(yytext);&lt;br /&gt;
  string s = yytext.ToLower();&lt;br /&gt;
  if (s==&amp;quot;integer&amp;quot;)&lt;br /&gt;
    yylval.dtVal.DType=DataType.INTTYPE;&lt;br /&gt;
  if (s == &amp;quot;real&amp;quot;)&lt;br /&gt;
      yylval.dtVal.DType =DataType.DOUBLETYPE;&lt;br /&gt;
  if (res == (int)Tokens.ID)&lt;br /&gt;
	yylval.sVal = yytext;&lt;br /&gt;
  return res;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{INTNUM} { &lt;br /&gt;
  yylval.iVal = int.Parse(yytext); &lt;br /&gt;
  return (int)Tokens.INTNUM; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{REALNUM} { &lt;br /&gt;
  yylval.dVal = double.Parse(yytext,new System.Globalization.CultureInfo(&amp;quot;en-US&amp;quot;)); &lt;br /&gt;
  return (int)Tokens.REALNUM; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
%{&lt;br /&gt;
  yylloc = new LexLocation(tokLin, tokCol, tokELin, tokECol);&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
class ScannerHelper &lt;br /&gt;
{&lt;br /&gt;
  private static Dictionary&amp;lt;string,int&amp;gt; keywords;&lt;br /&gt;
&lt;br /&gt;
  static ScannerHelper() &lt;br /&gt;
  {&lt;br /&gt;
    keywords = new Dictionary&amp;lt;string,int&amp;gt;();&lt;br /&gt;
    keywords.Add(&amp;quot;var&amp;quot;,(int)Tokens.kVAR);&lt;br /&gt;
    keywords.Add(&amp;quot;real&amp;quot;,(int)Tokens.kREAL);&lt;br /&gt;
    keywords.Add(&amp;quot;integer&amp;quot;,(int)Tokens.kINTEGER);&lt;br /&gt;
    keywords.Add(&amp;quot;boolean&amp;quot;,(int)Tokens.kBOOLEAN);&lt;br /&gt;
    keywords.Add(&amp;quot;begin&amp;quot;,(int)Tokens.kBEGIN);&lt;br /&gt;
    keywords.Add(&amp;quot;end&amp;quot;,(int)Tokens.kEND);&lt;br /&gt;
    keywords.Add(&amp;quot;if&amp;quot;,(int)Tokens.kIF);&lt;br /&gt;
    keywords.Add(&amp;quot;then&amp;quot;,(int)Tokens.kTHEN);&lt;br /&gt;
    keywords.Add(&amp;quot;else&amp;quot;,(int)Tokens.kELSE);&lt;br /&gt;
    keywords.Add(&amp;quot;do&amp;quot;,(int)Tokens.kDO);&lt;br /&gt;
    keywords.Add(&amp;quot;while&amp;quot;,(int)Tokens.kWHILE);&lt;br /&gt;
    keywords.Add(&amp;quot;write&amp;quot;,(int)Tokens.kWRITE);&lt;br /&gt;
    keywords.Add(&amp;quot;writeln&amp;quot;,(int)Tokens.kWRITELN);&lt;br /&gt;
    keywords.Add(&amp;quot;div&amp;quot;,(int)Tokens.DIV);&lt;br /&gt;
    keywords.Add(&amp;quot;mod&amp;quot;,(int)Tokens.MOD);&lt;br /&gt;
    keywords.Add(&amp;quot;and&amp;quot;,(int)Tokens.AND);&lt;br /&gt;
    keywords.Add(&amp;quot;or&amp;quot;,(int)Tokens.OR);&lt;br /&gt;
    keywords.Add(&amp;quot;not&amp;quot;,(int)Tokens.NOT);				&lt;br /&gt;
  }&lt;br /&gt;
  public static int GetIDToken(string s)&lt;br /&gt;
  {&lt;br /&gt;
    s = s.ToLower();&lt;br /&gt;
	if (keywords.ContainsKey(s))&lt;br /&gt;
	{ &lt;br /&gt;
	  return keywords[s];&lt;br /&gt;
	}  &lt;br /&gt;
	else&lt;br /&gt;
      return (int)Tokens.ID;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2202</id>
		<title>Грамматика языка Pascal</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2202"/>
		<updated>2011-10-05T18:37:54Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:AlexHit|Венцко Александр Зиновьевич]] 21:11, 21 сентября 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
'''Грамматика'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
%output=Yacc.cs &lt;br /&gt;
&lt;br /&gt;
%union { &lt;br /&gt;
	 public int iVal; &lt;br /&gt;
	 public double dVal; &lt;br /&gt;
         public string sVal; &lt;br /&gt;
         public ExprNode eVal;&lt;br /&gt;
         public TreeNode tVal;&lt;br /&gt;
         public BlockNode lVal;&lt;br /&gt;
         public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
	 public GreatType dtVal;&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
%using System.IO&lt;br /&gt;
%using Syntax_node_tree&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kDO kVAR kWRITE kWRITELN&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON POINT  &lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER kBOOLEAN&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; operator elsepart&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; listoperator progr &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; ident &lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   :&lt;br /&gt;
	{&lt;br /&gt;
		$$ = new Program(@$);&lt;br /&gt;
	}&lt;br /&gt;
	| defss kBEGIN listoperator kEND &lt;br /&gt;
	{&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
		foreach (Operator oper in $3.list)&lt;br /&gt;
			$$.list.Add(oper);&lt;br /&gt;
	}&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD TEXT!!!&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	} &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BlockOperator(@$);&lt;br /&gt;
		$$.list.Add($1);&lt;br /&gt;
	}&lt;br /&gt;
	|defss defs {&lt;br /&gt;
		$1.list.Add($2);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	|&lt;br /&gt;
	;&lt;br /&gt;
    &lt;br /&gt;
defs : kVAR ident COLON ktype SEMICOLUMN &lt;br /&gt;
	{&lt;br /&gt;
		TipType type;&lt;br /&gt;
		if ($4 == &amp;quot;int&amp;quot;)&lt;br /&gt;
			type = TipType.IntType;&lt;br /&gt;
		else if ($4 == &amp;quot;double&amp;quot;)&lt;br /&gt;
			type = TipType.DoubleType;&lt;br /&gt;
		else if ($4 == &amp;quot;bool&amp;quot;)&lt;br /&gt;
			type = TipType.BoolType;&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			 // Error: unknown type&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new VarDef(@$, $2, type);&lt;br /&gt;
	}&lt;br /&gt;
	;   &lt;br /&gt;
&lt;br /&gt;
ident: ID &lt;br /&gt;
	{&lt;br /&gt;
		if (GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: this name is already used&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = new Ident($1, @1);&lt;br /&gt;
		listVars.Add(Id);&lt;br /&gt;
		$$ = new List&amp;lt;Ident&amp;gt;();&lt;br /&gt;
		$$.Add(Id);&lt;br /&gt;
	}   &lt;br /&gt;
	|ident COLUMN ID &lt;br /&gt;
	{&lt;br /&gt;
		if (GlobalStructures.isNameExists($3))&lt;br /&gt;
		{&lt;br /&gt;
		// Error: this name is already used&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = new Ident($3, @3);&lt;br /&gt;
		listVars.Add(Id);&lt;br /&gt;
		$1.Add(Id);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
    &lt;br /&gt;
listoperator : operator &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BlockOperator(@$);&lt;br /&gt;
		$$.list.Add($1);&lt;br /&gt;
	}&lt;br /&gt;
	| listoperator SEMICOLUMN operator {&lt;br /&gt;
		$1.list.Add($2);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD GREATE TYPE&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL &lt;br /&gt;
	{&lt;br /&gt;
		$$ = &amp;quot;double&amp;quot;;&lt;br /&gt;
	} &lt;br /&gt;
	| kINTEGER &lt;br /&gt;
	{&lt;br /&gt;
		$$ = &amp;quot;int&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	| kBOOLEAN&lt;br /&gt;
	{&lt;br /&gt;
		$$ = &amp;quot;bool&amp;quot; &lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
operator: {}&lt;br /&gt;
	| ID ASSIGN expr &lt;br /&gt;
	{&lt;br /&gt;
		if (!GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Undeclarated identifier&lt;br /&gt;
		}&lt;br /&gt;
        Ident Id = GlobalStructures.getIdentByName($1);&lt;br /&gt;
        $$ = new Assign(Id, $3, @3);&lt;br /&gt;
	}&lt;br /&gt;
	| kWHILE expr kDO operator &lt;br /&gt;
	{&lt;br /&gt;
		if ($2.getType()!=TypType.Boolean)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Óñëîâèå äîëæíî èìåòü ëîãè÷åñêèé òèï&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new While($2, $4, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| kIF expr kTHEN operator elsepart &lt;br /&gt;
	{&lt;br /&gt;
		if ($2.getType()!=TypType.Boolean)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Óñëîâèå äîëæíî èìåòü ëîãè÷åñêèé òèï&lt;br /&gt;
		}&lt;br /&gt;
		$$=new If($2,$4,$5,@$);&lt;br /&gt;
	}&lt;br /&gt;
	| kBEGIN listoperator kEND &lt;br /&gt;
	{&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
	| kWRITE LPAREN expr RPAREN &lt;br /&gt;
	{&lt;br /&gt;
		System.Console.Write($3);&lt;br /&gt;
	}&lt;br /&gt;
	| kWRITELN LPAREN expr RPAREN&lt;br /&gt;
	{&lt;br /&gt;
		System.Console.WriteLine($3);&lt;br /&gt;
	}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: &lt;br /&gt;
	{&lt;br /&gt;
		$$ = null;&lt;br /&gt;
	}&lt;br /&gt;
	| kELSE operator {&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
expr: INTNUM &lt;br /&gt;
	{&lt;br /&gt;
		int i = int.Parse($1);&lt;br /&gt;
		$$ = new IntConst(i, @1);&lt;br /&gt;
	}&lt;br /&gt;
	| REALNUM &lt;br /&gt;
	{&lt;br /&gt;
		double d = double.Parse($1);&lt;br /&gt;
		$$ = new DoubleConst(d, @1);&lt;br /&gt;
	}&lt;br /&gt;
	| STRINGLITERAL &lt;br /&gt;
	{&lt;br /&gt;
		// Íåò ó íàñ òàêèõ!!!&lt;br /&gt;
	}&lt;br /&gt;
	| ID &lt;br /&gt;
	{&lt;br /&gt;
		if (!GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Undeclarated identifier&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new Ident($1, @1);&lt;br /&gt;
	}&lt;br /&gt;
	| expr PLUS expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Plus, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr MINUS expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Minus, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr MULT expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Mult, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr DIVIDE expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Divide, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr DIV expr &lt;br /&gt;
	{&lt;br /&gt;
		// Íå ïîääåðæèâàåòñÿ!&lt;br /&gt;
	}&lt;br /&gt;
	| expr MOD expr &lt;br /&gt;
	{&lt;br /&gt;
		// Íå ïîääåðæèâàåòñÿ!&lt;br /&gt;
	}&lt;br /&gt;
	| expr AND expr &lt;br /&gt;
	{&lt;br /&gt;
		if ($1.getType() != TipType.BoolType || $2.getType() != TipType.BoolType)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: only for bool types&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.And, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr OR expr &lt;br /&gt;
	{&lt;br /&gt;
		if ($1.getType() != TipType.BoolType || $2.getType() != TipType.BoolType)&lt;br /&gt;
		{&lt;br /&gt;
		    // Error: only for bool types&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Or, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr LT expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Less, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr GT expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.More, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr LE expr	&lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.LessEqual, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr GE expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.MoreEqual, @$);       &lt;br /&gt;
	}&lt;br /&gt;
	| expr EQ expr&lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Equal, @$);       &lt;br /&gt;
	}&lt;br /&gt;
	| expr NE expr &lt;br /&gt;
	{&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.NotEqual, @$);        &lt;br /&gt;
	}&lt;br /&gt;
	| NOT expr &lt;br /&gt;
	{&lt;br /&gt;
		if ($2.getType() != TipType.BoolType)&lt;br /&gt;
		{&lt;br /&gt;
		// Error: type is wrong.&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new UnarExpression($2, Op.Not, @2);&lt;br /&gt;
	}&lt;br /&gt;
	| MINUS expr %prec UMINUS &lt;br /&gt;
	{&lt;br /&gt;
		if ($2.getType() != TipType.IntType &amp;amp;&amp;amp; $2.getType() != TipType.DoubleType)&lt;br /&gt;
		{&lt;br /&gt;
		    // Error: type is wrong.&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new UnarExpression($2, Op.Minus, @2);&lt;br /&gt;
	} &lt;br /&gt;
	| LPAREN expr RPAREN &lt;br /&gt;
	{&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Сканер'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%using Syntax_node_tree;&lt;br /&gt;
&lt;br /&gt;
Alpha 	[a-zA-Z_]&lt;br /&gt;
INTNUM  [0-9]+&lt;br /&gt;
REALNUM {INTNUM}\.{INTNUM}&lt;br /&gt;
ID [a-zA-Z_][a-zA-Z0-9_]* &lt;br /&gt;
&lt;br /&gt;
%x COMMENT&lt;br /&gt;
%x COMMENT1&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
&amp;quot;{&amp;quot; { BEGIN(COMMENT);}&lt;br /&gt;
&amp;lt;COMMENT&amp;gt; &amp;quot;}&amp;quot; { BEGIN(INITIAL);}&lt;br /&gt;
&amp;lt;COMMENT&amp;gt; &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt; { Console.WriteLine(&amp;quot;Комментарий не закрыт&amp;quot;);}&lt;br /&gt;
&amp;quot;(*&amp;quot; { BEGIN(COMMENT1);}&lt;br /&gt;
&amp;lt;COMMENT1&amp;gt; &amp;quot;*)&amp;quot; { BEGIN(INITIAL);}&lt;br /&gt;
&amp;lt;COMMENT1&amp;gt; &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt; { Console.WriteLine(&amp;quot;Комментарий не закрыт&amp;quot;);}&lt;br /&gt;
&lt;br /&gt;
&amp;quot;:=&amp;quot; { return (int)Tokens.ASSIGN; }&lt;br /&gt;
&amp;quot;;&amp;quot; { return (int)Tokens.SEMICOLUMN; }&lt;br /&gt;
&amp;quot;-&amp;quot; { return (int)Tokens.MINUS; }&lt;br /&gt;
&amp;quot;+&amp;quot; { return (int)Tokens.PLUS; }&lt;br /&gt;
&amp;quot;*&amp;quot; { return (int)Tokens.MULT; }&lt;br /&gt;
&amp;quot;/&amp;quot; { return (int)Tokens.DIVIDE; }&lt;br /&gt;
&amp;quot;&amp;lt;&amp;quot; { return (int)Tokens.LT; }&lt;br /&gt;
&amp;quot;&amp;gt;&amp;quot; { return (int)Tokens.GT; }&lt;br /&gt;
&amp;quot;&amp;lt;=&amp;quot; { return (int)Tokens.LE; }&lt;br /&gt;
&amp;quot;&amp;gt;=&amp;quot; { return (int)Tokens.GE; }&lt;br /&gt;
&amp;quot;=&amp;quot; { return (int)Tokens.EQ; }&lt;br /&gt;
&amp;quot;&amp;lt;&amp;gt;&amp;quot; { return (int)Tokens.NE; }&lt;br /&gt;
&amp;quot;(&amp;quot; { return (int)Tokens.LPAREN; }&lt;br /&gt;
&amp;quot;)&amp;quot; { return (int)Tokens.RPAREN; }&lt;br /&gt;
&amp;quot;,&amp;quot; { return (int)Tokens.COLUMN; }&lt;br /&gt;
&amp;quot;:&amp;quot; { return (int)Tokens.COLON; }&lt;br /&gt;
&amp;quot;.&amp;quot; { return (int)Tokens.POINT;  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\'[^']*\' {&lt;br /&gt;
  yylval.sVal = yytext.Substring(1,yytext.Length-2);&lt;br /&gt;
  return (int)Tokens.STRINGLITERAL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{ID}  { &lt;br /&gt;
  int res = ScannerHelper.GetIDToken(yytext);&lt;br /&gt;
  string s = yytext.ToLower();&lt;br /&gt;
  if (s==&amp;quot;integer&amp;quot;)&lt;br /&gt;
    yylval.dtVal.DType=DataType.INTTYPE;&lt;br /&gt;
  if (s == &amp;quot;real&amp;quot;)&lt;br /&gt;
      yylval.dtVal.DType =DataType.DOUBLETYPE;&lt;br /&gt;
  if (res == (int)Tokens.ID)&lt;br /&gt;
	yylval.sVal = yytext;&lt;br /&gt;
  return res;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{INTNUM} { &lt;br /&gt;
  yylval.iVal = int.Parse(yytext); &lt;br /&gt;
  return (int)Tokens.INTNUM; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{REALNUM} { &lt;br /&gt;
  yylval.dVal = double.Parse(yytext,new System.Globalization.CultureInfo(&amp;quot;en-US&amp;quot;)); &lt;br /&gt;
  return (int)Tokens.REALNUM; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
%{&lt;br /&gt;
  yylloc = new LexLocation(tokLin, tokCol, tokELin, tokECol);&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
class ScannerHelper &lt;br /&gt;
{&lt;br /&gt;
  private static Dictionary&amp;lt;string,int&amp;gt; keywords;&lt;br /&gt;
&lt;br /&gt;
  static ScannerHelper() &lt;br /&gt;
  {&lt;br /&gt;
    keywords = new Dictionary&amp;lt;string,int&amp;gt;();&lt;br /&gt;
    keywords.Add(&amp;quot;var&amp;quot;,(int)Tokens.kVAR);&lt;br /&gt;
    keywords.Add(&amp;quot;real&amp;quot;,(int)Tokens.kREAL);&lt;br /&gt;
    keywords.Add(&amp;quot;integer&amp;quot;,(int)Tokens.kINTEGER);&lt;br /&gt;
    keywords.Add(&amp;quot;begin&amp;quot;,(int)Tokens.kBEGIN);&lt;br /&gt;
    keywords.Add(&amp;quot;end&amp;quot;,(int)Tokens.kEND);&lt;br /&gt;
    keywords.Add(&amp;quot;if&amp;quot;,(int)Tokens.kIF);&lt;br /&gt;
    keywords.Add(&amp;quot;then&amp;quot;,(int)Tokens.kTHEN);&lt;br /&gt;
    keywords.Add(&amp;quot;else&amp;quot;,(int)Tokens.kELSE);&lt;br /&gt;
    keywords.Add(&amp;quot;do&amp;quot;,(int)Tokens.kDO);&lt;br /&gt;
    keywords.Add(&amp;quot;while&amp;quot;,(int)Tokens.kWHILE);&lt;br /&gt;
    keywords.Add(&amp;quot;div&amp;quot;,(int)Tokens.DIV);&lt;br /&gt;
    keywords.Add(&amp;quot;mod&amp;quot;,(int)Tokens.MOD);&lt;br /&gt;
    keywords.Add(&amp;quot;and&amp;quot;,(int)Tokens.AND);&lt;br /&gt;
    keywords.Add(&amp;quot;or&amp;quot;,(int)Tokens.OR);&lt;br /&gt;
    keywords.Add(&amp;quot;not&amp;quot;,(int)Tokens.NOT);				&lt;br /&gt;
  }&lt;br /&gt;
  public static int GetIDToken(string s)&lt;br /&gt;
  {&lt;br /&gt;
    s = s.ToLower();&lt;br /&gt;
	if (keywords.ContainsKey(s))&lt;br /&gt;
	{ &lt;br /&gt;
	  return keywords[s];&lt;br /&gt;
	}  &lt;br /&gt;
	else&lt;br /&gt;
      return (int)Tokens.ID;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2187</id>
		<title>МПОК 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2187"/>
		<updated>2011-09-28T19:06:37Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Роли в проекте и задания разработчикам 2011]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка Pascal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка С]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Диаграмма классов синтаксического дерева]]&amp;lt;br&amp;gt;&lt;br /&gt;
Первичное описание классов синтаксического дерева 24.09.11 [http://files.mail.ru/47O3R5]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Науменко]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2186</id>
		<title>МПОК 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2186"/>
		<updated>2011-09-28T19:05:46Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Роли в проекте и задания разработчикам 2011]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка Pascal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка С]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Диаграмма классов синтаксического дерева]]&amp;lt;br&amp;gt;&lt;br /&gt;
Первичное описание классов синтаксического дерева 24.09.11 [http://files.mail.ru/47O3R5]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2185</id>
		<title>МПОК 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2185"/>
		<updated>2011-09-28T19:05:25Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Роли в проекте и задания разработчикам 2011]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка Pascal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка С]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Диаграмма классов синтаксического дерева]]&amp;lt;br&amp;gt;&lt;br /&gt;
Первичное описание классов синтаксического дерева 24.09.11 [http://files.mail.ru/47O3R5&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2179</id>
		<title>Грамматика языка Pascal</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2179"/>
		<updated>2011-09-22T09:04:09Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:AlexHit|Венцко Александр Зиновьевич]] 21:11, 21 сентября 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
'''Новый вариант'''&lt;br /&gt;
&lt;br /&gt;
И грамматика и сканер парсятся,готовые классы я выдам завтра на паре, возможны изменения, т.к. общей структуры, пока нет. &lt;br /&gt;
&lt;br /&gt;
Совет: рабочая группа (Найденов С. Баштанова Д.) сделайте библиотеку, а не консольный проект. Рекомендую посмотреть пост создания автоматической документации проекта на Visual Studio 2010 (в старых версиях, тоже есть) [http://msdn.microsoft.com/ru-ru/library/x4sa0ak0.aspx], чтобы не рисовать каждый раз диаграмму, куда проще делать это на автомате, да и быстрее!&lt;br /&gt;
&lt;br /&gt;
'''Грамматика'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
%union { &lt;br /&gt;
	 public int iVal; &lt;br /&gt;
	 public double dVal; &lt;br /&gt;
         public string sVal; &lt;br /&gt;
         public ExprNode eVal;&lt;br /&gt;
         public List&amp;lt;ExprNode&amp;gt; elVal;&lt;br /&gt;
         public TreeNode tVal;&lt;br /&gt;
         public BlockNode lVal;&lt;br /&gt;
         public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
	 public GreatType dtVal;&lt;br /&gt;
       }&lt;br /&gt;
%output=PascalYacc.cs &lt;br /&gt;
%using System.IO&lt;br /&gt;
%using Syntax_node_tree&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kDO kVAR&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON POINT  &lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; operator elsepart&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; listoperator progr &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; ident &lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : {}&lt;br /&gt;
	| defss kBEGIN listoperator kEND {}&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD TEXT!!!&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	} &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs &lt;br /&gt;
	|defss defs&lt;br /&gt;
	|&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR ident COLON ktype SEMICOLUMN {}&lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
ident   : ID {}	&lt;br /&gt;
        |ident COLUMN ID {}&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
listoperator    :   operator {}&lt;br /&gt;
	|   listoperator SEMICOLUMN operator {}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD GREATE TYPE&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL {} &lt;br /&gt;
	| kINTEGER {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
operator: {}&lt;br /&gt;
	| ID ASSIGN expr {}&lt;br /&gt;
	| kWHILE expr kDO operator {}&lt;br /&gt;
	operator {}&lt;br /&gt;
	| kIF expr kTHEN operator elsepart {}&lt;br /&gt;
	| kBEGIN listoperator kEND {}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {}&lt;br /&gt;
	| kELSE operator {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
exprlist : expr {}&lt;br /&gt;
	| exprlist COLUMN expr {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
expr:    INTNUM {}&lt;br /&gt;
        | REALNUM {}&lt;br /&gt;
        | STRINGLITERAL {}&lt;br /&gt;
        | ID {}    &lt;br /&gt;
    	| expr PLUS expr {}&lt;br /&gt;
    	| expr MINUS expr {}&lt;br /&gt;
    	| expr MULT expr {}&lt;br /&gt;
    	| expr DIVIDE expr {}&lt;br /&gt;
    	| expr DIV expr {}&lt;br /&gt;
    	| expr MOD expr {}&lt;br /&gt;
    	| expr AND expr {}&lt;br /&gt;
    	| expr OR expr {}&lt;br /&gt;
    	| expr LT expr {}&lt;br /&gt;
    	| expr GT expr {}&lt;br /&gt;
    	| expr LE expr {}&lt;br /&gt;
    	| expr GE expr {}&lt;br /&gt;
    	| expr EQ expr {}&lt;br /&gt;
    	| expr NE expr {}&lt;br /&gt;
    	| NOT expr {}&lt;br /&gt;
     	| MINUS expr %prec UMINUS {} &lt;br /&gt;
    	| LPAREN expr RPAREN {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Сканер'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%using Syntax_node_tree;&lt;br /&gt;
&lt;br /&gt;
Alpha 	[a-zA-Z_]&lt;br /&gt;
INTNUM  [0-9]+&lt;br /&gt;
REALNUM {INTNUM}\.{INTNUM}&lt;br /&gt;
ID [a-zA-Z_][a-zA-Z0-9_]* &lt;br /&gt;
&lt;br /&gt;
%x COMMENT&lt;br /&gt;
%x COMMENT1&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
&amp;quot;{&amp;quot; { BEGIN(COMMENT);}&lt;br /&gt;
&amp;lt;COMMENT&amp;gt; &amp;quot;}&amp;quot; { BEGIN(INITIAL);}&lt;br /&gt;
&amp;lt;COMMENT&amp;gt; &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt; { Console.WriteLine(&amp;quot;Комментарий не закрыт&amp;quot;);}&lt;br /&gt;
&amp;quot;(*&amp;quot; { BEGIN(COMMENT1);}&lt;br /&gt;
&amp;lt;COMMENT1&amp;gt; &amp;quot;*)&amp;quot; { BEGIN(INITIAL);}&lt;br /&gt;
&amp;lt;COMMENT1&amp;gt; &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt; { Console.WriteLine(&amp;quot;Комментарий не закрыт&amp;quot;);}&lt;br /&gt;
&lt;br /&gt;
&amp;quot;:=&amp;quot; { return (int)Tokens.ASSIGN; }&lt;br /&gt;
&amp;quot;;&amp;quot; { return (int)Tokens.SEMICOLUMN; }&lt;br /&gt;
&amp;quot;-&amp;quot; { return (int)Tokens.MINUS; }&lt;br /&gt;
&amp;quot;+&amp;quot; { return (int)Tokens.PLUS; }&lt;br /&gt;
&amp;quot;*&amp;quot; { return (int)Tokens.MULT; }&lt;br /&gt;
&amp;quot;/&amp;quot; { return (int)Tokens.DIVIDE; }&lt;br /&gt;
&amp;quot;&amp;lt;&amp;quot; { return (int)Tokens.LT; }&lt;br /&gt;
&amp;quot;&amp;gt;&amp;quot; { return (int)Tokens.GT; }&lt;br /&gt;
&amp;quot;&amp;lt;=&amp;quot; { return (int)Tokens.LE; }&lt;br /&gt;
&amp;quot;&amp;gt;=&amp;quot; { return (int)Tokens.GE; }&lt;br /&gt;
&amp;quot;=&amp;quot; { return (int)Tokens.EQ; }&lt;br /&gt;
&amp;quot;&amp;lt;&amp;gt;&amp;quot; { return (int)Tokens.NE; }&lt;br /&gt;
&amp;quot;(&amp;quot; { return (int)Tokens.LPAREN; }&lt;br /&gt;
&amp;quot;)&amp;quot; { return (int)Tokens.RPAREN; }&lt;br /&gt;
&amp;quot;,&amp;quot; { return (int)Tokens.COLUMN; }&lt;br /&gt;
&amp;quot;:&amp;quot; { return (int)Tokens.COLON; }&lt;br /&gt;
&amp;quot;.&amp;quot; { return (int)Tokens.POINT;  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\'[^']*\' {&lt;br /&gt;
  yylval.sVal = yytext.Substring(1,yytext.Length-2);&lt;br /&gt;
  return (int)Tokens.STRINGLITERAL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{ID}  { &lt;br /&gt;
  int res = ScannerHelper.GetIDToken(yytext);&lt;br /&gt;
  string s = yytext.ToLower();&lt;br /&gt;
  if (s==&amp;quot;integer&amp;quot;)&lt;br /&gt;
    yylval.dtVal.DType=DataType.INTTYPE;&lt;br /&gt;
  if (s == &amp;quot;real&amp;quot;)&lt;br /&gt;
      yylval.dtVal.DType =DataType.DOUBLETYPE;&lt;br /&gt;
  if (res == (int)Tokens.ID)&lt;br /&gt;
	yylval.sVal = yytext;&lt;br /&gt;
  return res;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{INTNUM} { &lt;br /&gt;
  yylval.iVal = int.Parse(yytext); &lt;br /&gt;
  return (int)Tokens.INTNUM; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{REALNUM} { &lt;br /&gt;
  yylval.dVal = double.Parse(yytext,new System.Globalization.CultureInfo(&amp;quot;en-US&amp;quot;)); &lt;br /&gt;
  return (int)Tokens.REALNUM; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
%{&lt;br /&gt;
  yylloc = new LexLocation(tokLin, tokCol, tokELin, tokECol);&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
class ScannerHelper &lt;br /&gt;
{&lt;br /&gt;
  private static Dictionary&amp;lt;string,int&amp;gt; keywords;&lt;br /&gt;
&lt;br /&gt;
  static ScannerHelper() &lt;br /&gt;
  {&lt;br /&gt;
    keywords = new Dictionary&amp;lt;string,int&amp;gt;();&lt;br /&gt;
    keywords.Add(&amp;quot;var&amp;quot;,(int)Tokens.kVAR);&lt;br /&gt;
    keywords.Add(&amp;quot;real&amp;quot;,(int)Tokens.kREAL);&lt;br /&gt;
    keywords.Add(&amp;quot;integer&amp;quot;,(int)Tokens.kINTEGER);&lt;br /&gt;
    keywords.Add(&amp;quot;begin&amp;quot;,(int)Tokens.kBEGIN);&lt;br /&gt;
    keywords.Add(&amp;quot;end&amp;quot;,(int)Tokens.kEND);&lt;br /&gt;
    keywords.Add(&amp;quot;if&amp;quot;,(int)Tokens.kIF);&lt;br /&gt;
    keywords.Add(&amp;quot;then&amp;quot;,(int)Tokens.kTHEN);&lt;br /&gt;
    keywords.Add(&amp;quot;else&amp;quot;,(int)Tokens.kELSE);&lt;br /&gt;
    keywords.Add(&amp;quot;do&amp;quot;,(int)Tokens.kDO);&lt;br /&gt;
    keywords.Add(&amp;quot;while&amp;quot;,(int)Tokens.kWHILE);&lt;br /&gt;
    keywords.Add(&amp;quot;div&amp;quot;,(int)Tokens.DIV);&lt;br /&gt;
    keywords.Add(&amp;quot;mod&amp;quot;,(int)Tokens.MOD);&lt;br /&gt;
    keywords.Add(&amp;quot;and&amp;quot;,(int)Tokens.AND);&lt;br /&gt;
    keywords.Add(&amp;quot;or&amp;quot;,(int)Tokens.OR);&lt;br /&gt;
    keywords.Add(&amp;quot;not&amp;quot;,(int)Tokens.NOT);				&lt;br /&gt;
  }&lt;br /&gt;
  public static int GetIDToken(string s)&lt;br /&gt;
  {&lt;br /&gt;
    s = s.ToLower();&lt;br /&gt;
	if (keywords.ContainsKey(s))&lt;br /&gt;
	{ &lt;br /&gt;
	  return keywords[s];&lt;br /&gt;
	}  &lt;br /&gt;
	else&lt;br /&gt;
      return (int)Tokens.ID;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2178</id>
		<title>Грамматика языка Pascal</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2178"/>
		<updated>2011-09-21T21:13:44Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:AlexHit|Венцко Александр Зиновьевич]] 21:11, 21 сентября 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
'''Новый вариант'''&lt;br /&gt;
&lt;br /&gt;
И грамматика и сканер парсятся,готовые классы я выдам завтра на паре, возможны изменения, т.к. общей структуры, пока нет. &lt;br /&gt;
&lt;br /&gt;
Замечание: рабочая группа (Найденов С. Баштанова Д.) сделайте библиотеку, а не консольный проект (это не сложно - 5 минут), так же не смог закачать вашу диаграмму... Рекомендую посмотреть пост создания автоматической документации проекта на Visual Studio 2010 (в старых версиях, тоже есть) [http://msdn.microsoft.com/ru-ru/library/x4sa0ak0.aspx], чтобы не рисовать каждый раз диаграмму, куда проще делать это на автомате, да и быстрее!&lt;br /&gt;
&lt;br /&gt;
'''Грамматика'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
%union { &lt;br /&gt;
	 public int iVal; &lt;br /&gt;
	 public double dVal; &lt;br /&gt;
         public string sVal; &lt;br /&gt;
         public ExprNode eVal;&lt;br /&gt;
         public List&amp;lt;ExprNode&amp;gt; elVal;&lt;br /&gt;
         public TreeNode tVal;&lt;br /&gt;
         public BlockNode lVal;&lt;br /&gt;
         public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
	 public GreatType dtVal;&lt;br /&gt;
       }&lt;br /&gt;
%output=PascalYacc.cs &lt;br /&gt;
%using System.IO&lt;br /&gt;
%using Syntax_node_tree&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kDO kVAR&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON POINT  &lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; operator elsepart&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; listoperator progr &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; ident &lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : {}&lt;br /&gt;
	| defss kBEGIN listoperator kEND {}&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD TEXT!!!&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	} &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs &lt;br /&gt;
	|defss defs&lt;br /&gt;
	|&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR ident COLON ktype SEMICOLUMN {}&lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
ident   : ID {}	&lt;br /&gt;
        |ident COLUMN ID {}&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
listoperator    :   operator {}&lt;br /&gt;
	|   listoperator SEMICOLUMN operator {}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD GREATE TYPE&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL {} &lt;br /&gt;
	| kINTEGER {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
operator: {}&lt;br /&gt;
	| ID ASSIGN expr {}&lt;br /&gt;
	| kWHILE expr kDO operator {}&lt;br /&gt;
	operator {}&lt;br /&gt;
	| kIF expr kTHEN operator elsepart {}&lt;br /&gt;
	| kBEGIN listoperator kEND {}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {}&lt;br /&gt;
	| kELSE operator {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
exprlist : expr {}&lt;br /&gt;
	| exprlist COLUMN expr {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
expr:    INTNUM {}&lt;br /&gt;
        | REALNUM {}&lt;br /&gt;
        | STRINGLITERAL {}&lt;br /&gt;
        | ID {}    &lt;br /&gt;
    	| expr PLUS expr {}&lt;br /&gt;
    	| expr MINUS expr {}&lt;br /&gt;
    	| expr MULT expr {}&lt;br /&gt;
    	| expr DIVIDE expr {}&lt;br /&gt;
    	| expr DIV expr {}&lt;br /&gt;
    	| expr MOD expr {}&lt;br /&gt;
    	| expr AND expr {}&lt;br /&gt;
    	| expr OR expr {}&lt;br /&gt;
    	| expr LT expr {}&lt;br /&gt;
    	| expr GT expr {}&lt;br /&gt;
    	| expr LE expr {}&lt;br /&gt;
    	| expr GE expr {}&lt;br /&gt;
    	| expr EQ expr {}&lt;br /&gt;
    	| expr NE expr {}&lt;br /&gt;
    	| NOT expr {}&lt;br /&gt;
     	| MINUS expr %prec UMINUS {} &lt;br /&gt;
    	| LPAREN expr RPAREN {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Сканер'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%using Syntax_node_tree;&lt;br /&gt;
&lt;br /&gt;
Alpha 	[a-zA-Z_]&lt;br /&gt;
INTNUM  [0-9]+&lt;br /&gt;
REALNUM {INTNUM}\.{INTNUM}&lt;br /&gt;
ID [a-zA-Z_][a-zA-Z0-9_]* &lt;br /&gt;
&lt;br /&gt;
%x COMMENT&lt;br /&gt;
%x COMMENT1&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
&amp;quot;{&amp;quot; { BEGIN(COMMENT);}&lt;br /&gt;
&amp;lt;COMMENT&amp;gt; &amp;quot;}&amp;quot; { BEGIN(INITIAL);}&lt;br /&gt;
&amp;lt;COMMENT&amp;gt; &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt; { Console.WriteLine(&amp;quot;Комментарий не закрыт&amp;quot;);}&lt;br /&gt;
&amp;quot;(*&amp;quot; { BEGIN(COMMENT1);}&lt;br /&gt;
&amp;lt;COMMENT1&amp;gt; &amp;quot;*)&amp;quot; { BEGIN(INITIAL);}&lt;br /&gt;
&amp;lt;COMMENT1&amp;gt; &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt; { Console.WriteLine(&amp;quot;Комментарий не закрыт&amp;quot;);}&lt;br /&gt;
&lt;br /&gt;
&amp;quot;:=&amp;quot; { return (int)Tokens.ASSIGN; }&lt;br /&gt;
&amp;quot;;&amp;quot; { return (int)Tokens.SEMICOLUMN; }&lt;br /&gt;
&amp;quot;-&amp;quot; { return (int)Tokens.MINUS; }&lt;br /&gt;
&amp;quot;+&amp;quot; { return (int)Tokens.PLUS; }&lt;br /&gt;
&amp;quot;*&amp;quot; { return (int)Tokens.MULT; }&lt;br /&gt;
&amp;quot;/&amp;quot; { return (int)Tokens.DIVIDE; }&lt;br /&gt;
&amp;quot;&amp;lt;&amp;quot; { return (int)Tokens.LT; }&lt;br /&gt;
&amp;quot;&amp;gt;&amp;quot; { return (int)Tokens.GT; }&lt;br /&gt;
&amp;quot;&amp;lt;=&amp;quot; { return (int)Tokens.LE; }&lt;br /&gt;
&amp;quot;&amp;gt;=&amp;quot; { return (int)Tokens.GE; }&lt;br /&gt;
&amp;quot;=&amp;quot; { return (int)Tokens.EQ; }&lt;br /&gt;
&amp;quot;&amp;lt;&amp;gt;&amp;quot; { return (int)Tokens.NE; }&lt;br /&gt;
&amp;quot;(&amp;quot; { return (int)Tokens.LPAREN; }&lt;br /&gt;
&amp;quot;)&amp;quot; { return (int)Tokens.RPAREN; }&lt;br /&gt;
&amp;quot;,&amp;quot; { return (int)Tokens.COLUMN; }&lt;br /&gt;
&amp;quot;:&amp;quot; { return (int)Tokens.COLON; }&lt;br /&gt;
&amp;quot;.&amp;quot; { return (int)Tokens.POINT;  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\'[^']*\' {&lt;br /&gt;
  yylval.sVal = yytext.Substring(1,yytext.Length-2);&lt;br /&gt;
  return (int)Tokens.STRINGLITERAL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{ID}  { &lt;br /&gt;
  int res = ScannerHelper.GetIDToken(yytext);&lt;br /&gt;
  string s = yytext.ToLower();&lt;br /&gt;
  if (s==&amp;quot;integer&amp;quot;)&lt;br /&gt;
    yylval.dtVal.DType=DataType.INTTYPE;&lt;br /&gt;
  if (s == &amp;quot;real&amp;quot;)&lt;br /&gt;
      yylval.dtVal.DType =DataType.DOUBLETYPE;&lt;br /&gt;
  if (res == (int)Tokens.ID)&lt;br /&gt;
	yylval.sVal = yytext;&lt;br /&gt;
  return res;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{INTNUM} { &lt;br /&gt;
  yylval.iVal = int.Parse(yytext); &lt;br /&gt;
  return (int)Tokens.INTNUM; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{REALNUM} { &lt;br /&gt;
  yylval.dVal = double.Parse(yytext,new System.Globalization.CultureInfo(&amp;quot;en-US&amp;quot;)); &lt;br /&gt;
  return (int)Tokens.REALNUM; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
%{&lt;br /&gt;
  yylloc = new LexLocation(tokLin, tokCol, tokELin, tokECol);&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
class ScannerHelper &lt;br /&gt;
{&lt;br /&gt;
  private static Dictionary&amp;lt;string,int&amp;gt; keywords;&lt;br /&gt;
&lt;br /&gt;
  static ScannerHelper() &lt;br /&gt;
  {&lt;br /&gt;
    keywords = new Dictionary&amp;lt;string,int&amp;gt;();&lt;br /&gt;
    keywords.Add(&amp;quot;var&amp;quot;,(int)Tokens.kVAR);&lt;br /&gt;
    keywords.Add(&amp;quot;real&amp;quot;,(int)Tokens.kREAL);&lt;br /&gt;
    keywords.Add(&amp;quot;integer&amp;quot;,(int)Tokens.kINTEGER);&lt;br /&gt;
    keywords.Add(&amp;quot;begin&amp;quot;,(int)Tokens.kBEGIN);&lt;br /&gt;
    keywords.Add(&amp;quot;end&amp;quot;,(int)Tokens.kEND);&lt;br /&gt;
    keywords.Add(&amp;quot;if&amp;quot;,(int)Tokens.kIF);&lt;br /&gt;
    keywords.Add(&amp;quot;then&amp;quot;,(int)Tokens.kTHEN);&lt;br /&gt;
    keywords.Add(&amp;quot;else&amp;quot;,(int)Tokens.kELSE);&lt;br /&gt;
    keywords.Add(&amp;quot;do&amp;quot;,(int)Tokens.kDO);&lt;br /&gt;
    keywords.Add(&amp;quot;while&amp;quot;,(int)Tokens.kWHILE);&lt;br /&gt;
    keywords.Add(&amp;quot;div&amp;quot;,(int)Tokens.DIV);&lt;br /&gt;
    keywords.Add(&amp;quot;mod&amp;quot;,(int)Tokens.MOD);&lt;br /&gt;
    keywords.Add(&amp;quot;and&amp;quot;,(int)Tokens.AND);&lt;br /&gt;
    keywords.Add(&amp;quot;or&amp;quot;,(int)Tokens.OR);&lt;br /&gt;
    keywords.Add(&amp;quot;not&amp;quot;,(int)Tokens.NOT);				&lt;br /&gt;
  }&lt;br /&gt;
  public static int GetIDToken(string s)&lt;br /&gt;
  {&lt;br /&gt;
    s = s.ToLower();&lt;br /&gt;
	if (keywords.ContainsKey(s))&lt;br /&gt;
	{ &lt;br /&gt;
	  return keywords[s];&lt;br /&gt;
	}  &lt;br /&gt;
	else&lt;br /&gt;
      return (int)Tokens.ID;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2177</id>
		<title>Грамматика языка Pascal</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2177"/>
		<updated>2011-09-21T21:12:43Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:AlexHit|Венцко Александр Зиновьевич]] 21:11, 21 сентября 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
'''Новый вариант'''&lt;br /&gt;
&lt;br /&gt;
И грамматика и сканер парсятся,готовые классы я выдам завтра на паре, возможны изменения, т.к. общей структуры, пока нет. &lt;br /&gt;
&lt;br /&gt;
Замечание: рабочая группа (Найденов С. Баштанова Д.) сделайте библиотеку, а не консольный проект (это не сложно - 5 минут), так же не смог закачать вашу диаграмму... Рекомендую посмотреть пост создания автоматической документации проекта на Visual Studio 2010 (в старых версия тоже есть) [http://msdn.microsoft.com/ru-ru/library/x4sa0ak0.aspx], чтобы не рисовать каждый раз диаграмму, куда проще делать это на автомате, да и быстрее!&lt;br /&gt;
&lt;br /&gt;
'''Грамматика'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
%union { &lt;br /&gt;
	 public int iVal; &lt;br /&gt;
	 public double dVal; &lt;br /&gt;
         public string sVal; &lt;br /&gt;
         public ExprNode eVal;&lt;br /&gt;
         public List&amp;lt;ExprNode&amp;gt; elVal;&lt;br /&gt;
         public TreeNode tVal;&lt;br /&gt;
         public BlockNode lVal;&lt;br /&gt;
         public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
	 public GreatType dtVal;&lt;br /&gt;
       }&lt;br /&gt;
%output=PascalYacc.cs &lt;br /&gt;
%using System.IO&lt;br /&gt;
%using Syntax_node_tree&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kDO kVAR&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON POINT  &lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; operator elsepart&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; listoperator progr &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; ident &lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : {}&lt;br /&gt;
	| defss kBEGIN listoperator kEND {}&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD TEXT!!!&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	} &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs &lt;br /&gt;
	|defss defs&lt;br /&gt;
	|&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR ident COLON ktype SEMICOLUMN {}&lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
ident   : ID {}	&lt;br /&gt;
        |ident COLUMN ID {}&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
listoperator    :   operator {}&lt;br /&gt;
	|   listoperator SEMICOLUMN operator {}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD GREATE TYPE&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL {} &lt;br /&gt;
	| kINTEGER {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
operator: {}&lt;br /&gt;
	| ID ASSIGN expr {}&lt;br /&gt;
	| kWHILE expr kDO operator {}&lt;br /&gt;
	operator {}&lt;br /&gt;
	| kIF expr kTHEN operator elsepart {}&lt;br /&gt;
	| kBEGIN listoperator kEND {}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {}&lt;br /&gt;
	| kELSE operator {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
exprlist : expr {}&lt;br /&gt;
	| exprlist COLUMN expr {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
expr:    INTNUM {}&lt;br /&gt;
        | REALNUM {}&lt;br /&gt;
        | STRINGLITERAL {}&lt;br /&gt;
        | ID {}    &lt;br /&gt;
    	| expr PLUS expr {}&lt;br /&gt;
    	| expr MINUS expr {}&lt;br /&gt;
    	| expr MULT expr {}&lt;br /&gt;
    	| expr DIVIDE expr {}&lt;br /&gt;
    	| expr DIV expr {}&lt;br /&gt;
    	| expr MOD expr {}&lt;br /&gt;
    	| expr AND expr {}&lt;br /&gt;
    	| expr OR expr {}&lt;br /&gt;
    	| expr LT expr {}&lt;br /&gt;
    	| expr GT expr {}&lt;br /&gt;
    	| expr LE expr {}&lt;br /&gt;
    	| expr GE expr {}&lt;br /&gt;
    	| expr EQ expr {}&lt;br /&gt;
    	| expr NE expr {}&lt;br /&gt;
    	| NOT expr {}&lt;br /&gt;
     	| MINUS expr %prec UMINUS {} &lt;br /&gt;
    	| LPAREN expr RPAREN {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Сканер'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%using Syntax_node_tree;&lt;br /&gt;
&lt;br /&gt;
Alpha 	[a-zA-Z_]&lt;br /&gt;
INTNUM  [0-9]+&lt;br /&gt;
REALNUM {INTNUM}\.{INTNUM}&lt;br /&gt;
ID [a-zA-Z_][a-zA-Z0-9_]* &lt;br /&gt;
&lt;br /&gt;
%x COMMENT&lt;br /&gt;
%x COMMENT1&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
&amp;quot;{&amp;quot; { BEGIN(COMMENT);}&lt;br /&gt;
&amp;lt;COMMENT&amp;gt; &amp;quot;}&amp;quot; { BEGIN(INITIAL);}&lt;br /&gt;
&amp;lt;COMMENT&amp;gt; &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt; { Console.WriteLine(&amp;quot;Комментарий не закрыт&amp;quot;);}&lt;br /&gt;
&amp;quot;(*&amp;quot; { BEGIN(COMMENT1);}&lt;br /&gt;
&amp;lt;COMMENT1&amp;gt; &amp;quot;*)&amp;quot; { BEGIN(INITIAL);}&lt;br /&gt;
&amp;lt;COMMENT1&amp;gt; &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt; { Console.WriteLine(&amp;quot;Комментарий не закрыт&amp;quot;);}&lt;br /&gt;
&lt;br /&gt;
&amp;quot;:=&amp;quot; { return (int)Tokens.ASSIGN; }&lt;br /&gt;
&amp;quot;;&amp;quot; { return (int)Tokens.SEMICOLUMN; }&lt;br /&gt;
&amp;quot;-&amp;quot; { return (int)Tokens.MINUS; }&lt;br /&gt;
&amp;quot;+&amp;quot; { return (int)Tokens.PLUS; }&lt;br /&gt;
&amp;quot;*&amp;quot; { return (int)Tokens.MULT; }&lt;br /&gt;
&amp;quot;/&amp;quot; { return (int)Tokens.DIVIDE; }&lt;br /&gt;
&amp;quot;&amp;lt;&amp;quot; { return (int)Tokens.LT; }&lt;br /&gt;
&amp;quot;&amp;gt;&amp;quot; { return (int)Tokens.GT; }&lt;br /&gt;
&amp;quot;&amp;lt;=&amp;quot; { return (int)Tokens.LE; }&lt;br /&gt;
&amp;quot;&amp;gt;=&amp;quot; { return (int)Tokens.GE; }&lt;br /&gt;
&amp;quot;=&amp;quot; { return (int)Tokens.EQ; }&lt;br /&gt;
&amp;quot;&amp;lt;&amp;gt;&amp;quot; { return (int)Tokens.NE; }&lt;br /&gt;
&amp;quot;(&amp;quot; { return (int)Tokens.LPAREN; }&lt;br /&gt;
&amp;quot;)&amp;quot; { return (int)Tokens.RPAREN; }&lt;br /&gt;
&amp;quot;,&amp;quot; { return (int)Tokens.COLUMN; }&lt;br /&gt;
&amp;quot;:&amp;quot; { return (int)Tokens.COLON; }&lt;br /&gt;
&amp;quot;.&amp;quot; { return (int)Tokens.POINT;  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\'[^']*\' {&lt;br /&gt;
  yylval.sVal = yytext.Substring(1,yytext.Length-2);&lt;br /&gt;
  return (int)Tokens.STRINGLITERAL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{ID}  { &lt;br /&gt;
  int res = ScannerHelper.GetIDToken(yytext);&lt;br /&gt;
  string s = yytext.ToLower();&lt;br /&gt;
  if (s==&amp;quot;integer&amp;quot;)&lt;br /&gt;
    yylval.dtVal.DType=DataType.INTTYPE;&lt;br /&gt;
  if (s == &amp;quot;real&amp;quot;)&lt;br /&gt;
      yylval.dtVal.DType =DataType.DOUBLETYPE;&lt;br /&gt;
  if (res == (int)Tokens.ID)&lt;br /&gt;
	yylval.sVal = yytext;&lt;br /&gt;
  return res;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{INTNUM} { &lt;br /&gt;
  yylval.iVal = int.Parse(yytext); &lt;br /&gt;
  return (int)Tokens.INTNUM; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{REALNUM} { &lt;br /&gt;
  yylval.dVal = double.Parse(yytext,new System.Globalization.CultureInfo(&amp;quot;en-US&amp;quot;)); &lt;br /&gt;
  return (int)Tokens.REALNUM; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
%{&lt;br /&gt;
  yylloc = new LexLocation(tokLin, tokCol, tokELin, tokECol);&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
class ScannerHelper &lt;br /&gt;
{&lt;br /&gt;
  private static Dictionary&amp;lt;string,int&amp;gt; keywords;&lt;br /&gt;
&lt;br /&gt;
  static ScannerHelper() &lt;br /&gt;
  {&lt;br /&gt;
    keywords = new Dictionary&amp;lt;string,int&amp;gt;();&lt;br /&gt;
    keywords.Add(&amp;quot;var&amp;quot;,(int)Tokens.kVAR);&lt;br /&gt;
    keywords.Add(&amp;quot;real&amp;quot;,(int)Tokens.kREAL);&lt;br /&gt;
    keywords.Add(&amp;quot;integer&amp;quot;,(int)Tokens.kINTEGER);&lt;br /&gt;
    keywords.Add(&amp;quot;begin&amp;quot;,(int)Tokens.kBEGIN);&lt;br /&gt;
    keywords.Add(&amp;quot;end&amp;quot;,(int)Tokens.kEND);&lt;br /&gt;
    keywords.Add(&amp;quot;if&amp;quot;,(int)Tokens.kIF);&lt;br /&gt;
    keywords.Add(&amp;quot;then&amp;quot;,(int)Tokens.kTHEN);&lt;br /&gt;
    keywords.Add(&amp;quot;else&amp;quot;,(int)Tokens.kELSE);&lt;br /&gt;
    keywords.Add(&amp;quot;do&amp;quot;,(int)Tokens.kDO);&lt;br /&gt;
    keywords.Add(&amp;quot;while&amp;quot;,(int)Tokens.kWHILE);&lt;br /&gt;
    keywords.Add(&amp;quot;div&amp;quot;,(int)Tokens.DIV);&lt;br /&gt;
    keywords.Add(&amp;quot;mod&amp;quot;,(int)Tokens.MOD);&lt;br /&gt;
    keywords.Add(&amp;quot;and&amp;quot;,(int)Tokens.AND);&lt;br /&gt;
    keywords.Add(&amp;quot;or&amp;quot;,(int)Tokens.OR);&lt;br /&gt;
    keywords.Add(&amp;quot;not&amp;quot;,(int)Tokens.NOT);				&lt;br /&gt;
  }&lt;br /&gt;
  public static int GetIDToken(string s)&lt;br /&gt;
  {&lt;br /&gt;
    s = s.ToLower();&lt;br /&gt;
	if (keywords.ContainsKey(s))&lt;br /&gt;
	{ &lt;br /&gt;
	  return keywords[s];&lt;br /&gt;
	}  &lt;br /&gt;
	else&lt;br /&gt;
      return (int)Tokens.ID;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2176</id>
		<title>Грамматика языка Pascal</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2176"/>
		<updated>2011-09-21T21:11:22Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:AlexHit|Венцко Александр Зиновьевич]] 21:11, 21 сентября 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
'''Новый вариант'''&lt;br /&gt;
&lt;br /&gt;
И грамматика и сканер парсятся,готовые классы я выдам завтра на паре, возможны изменения, т.к. общей структуры, пока нет. &lt;br /&gt;
&lt;br /&gt;
Замечание: рабочая группа (Найденов С. Баштанова Д.) сделайте библиотеку, а не консольный проект (это не сложно - 5 минут), так же не смог закачать вашу диаграмму... Рекомендую посмотреть пост создания автоматической документации проекта на Visual Studio 2010 (в старых версия тоже есть) [http://msdn.microsoft.com/ru-ru/library/x4sa0ak0.aspx], чтобы не рисовать каждый раз диаграмму, куда проще делать это на автомате да и быстрее!&lt;br /&gt;
&lt;br /&gt;
'''Грамматика'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
%union { &lt;br /&gt;
	 public int iVal; &lt;br /&gt;
	 public double dVal; &lt;br /&gt;
         public string sVal; &lt;br /&gt;
         public ExprNode eVal;&lt;br /&gt;
         public List&amp;lt;ExprNode&amp;gt; elVal;&lt;br /&gt;
         public TreeNode tVal;&lt;br /&gt;
         public BlockNode lVal;&lt;br /&gt;
         public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
	 public GreatType dtVal;&lt;br /&gt;
       }&lt;br /&gt;
%output=PascalYacc.cs &lt;br /&gt;
%using System.IO&lt;br /&gt;
%using Syntax_node_tree&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kDO kVAR&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON POINT  &lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; operator elsepart&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; listoperator progr &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; ident &lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : {}&lt;br /&gt;
	| defss kBEGIN listoperator kEND {}&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD TEXT!!!&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	} &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs &lt;br /&gt;
	|defss defs&lt;br /&gt;
	|&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR ident COLON ktype SEMICOLUMN {}&lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
ident   : ID {}	&lt;br /&gt;
        |ident COLUMN ID {}&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
listoperator    :   operator {}&lt;br /&gt;
	|   listoperator SEMICOLUMN operator {}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD GREATE TYPE&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL {} &lt;br /&gt;
	| kINTEGER {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
operator: {}&lt;br /&gt;
	| ID ASSIGN expr {}&lt;br /&gt;
	| kWHILE expr kDO operator {}&lt;br /&gt;
	operator {}&lt;br /&gt;
	| kIF expr kTHEN operator elsepart {}&lt;br /&gt;
	| kBEGIN listoperator kEND {}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {}&lt;br /&gt;
	| kELSE operator {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
exprlist : expr {}&lt;br /&gt;
	| exprlist COLUMN expr {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
expr:    INTNUM {}&lt;br /&gt;
        | REALNUM {}&lt;br /&gt;
        | STRINGLITERAL {}&lt;br /&gt;
        | ID {}    &lt;br /&gt;
    	| expr PLUS expr {}&lt;br /&gt;
    	| expr MINUS expr {}&lt;br /&gt;
    	| expr MULT expr {}&lt;br /&gt;
    	| expr DIVIDE expr {}&lt;br /&gt;
    	| expr DIV expr {}&lt;br /&gt;
    	| expr MOD expr {}&lt;br /&gt;
    	| expr AND expr {}&lt;br /&gt;
    	| expr OR expr {}&lt;br /&gt;
    	| expr LT expr {}&lt;br /&gt;
    	| expr GT expr {}&lt;br /&gt;
    	| expr LE expr {}&lt;br /&gt;
    	| expr GE expr {}&lt;br /&gt;
    	| expr EQ expr {}&lt;br /&gt;
    	| expr NE expr {}&lt;br /&gt;
    	| NOT expr {}&lt;br /&gt;
     	| MINUS expr %prec UMINUS {} &lt;br /&gt;
    	| LPAREN expr RPAREN {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''сканер'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%using Syntax_node_tree;&lt;br /&gt;
&lt;br /&gt;
Alpha 	[a-zA-Z_]&lt;br /&gt;
INTNUM  [0-9]+&lt;br /&gt;
REALNUM {INTNUM}\.{INTNUM}&lt;br /&gt;
ID [a-zA-Z_][a-zA-Z0-9_]* &lt;br /&gt;
&lt;br /&gt;
%x COMMENT&lt;br /&gt;
%x COMMENT1&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
&amp;quot;{&amp;quot; { BEGIN(COMMENT);}&lt;br /&gt;
&amp;lt;COMMENT&amp;gt; &amp;quot;}&amp;quot; { BEGIN(INITIAL);}&lt;br /&gt;
&amp;lt;COMMENT&amp;gt; &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt; { Console.WriteLine(&amp;quot;Комментарий не закрыт&amp;quot;);}&lt;br /&gt;
&amp;quot;(*&amp;quot; { BEGIN(COMMENT1);}&lt;br /&gt;
&amp;lt;COMMENT1&amp;gt; &amp;quot;*)&amp;quot; { BEGIN(INITIAL);}&lt;br /&gt;
&amp;lt;COMMENT1&amp;gt; &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt; { Console.WriteLine(&amp;quot;Комментарий не закрыт&amp;quot;);}&lt;br /&gt;
&lt;br /&gt;
&amp;quot;:=&amp;quot; { return (int)Tokens.ASSIGN; }&lt;br /&gt;
&amp;quot;;&amp;quot; { return (int)Tokens.SEMICOLUMN; }&lt;br /&gt;
&amp;quot;-&amp;quot; { return (int)Tokens.MINUS; }&lt;br /&gt;
&amp;quot;+&amp;quot; { return (int)Tokens.PLUS; }&lt;br /&gt;
&amp;quot;*&amp;quot; { return (int)Tokens.MULT; }&lt;br /&gt;
&amp;quot;/&amp;quot; { return (int)Tokens.DIVIDE; }&lt;br /&gt;
&amp;quot;&amp;lt;&amp;quot; { return (int)Tokens.LT; }&lt;br /&gt;
&amp;quot;&amp;gt;&amp;quot; { return (int)Tokens.GT; }&lt;br /&gt;
&amp;quot;&amp;lt;=&amp;quot; { return (int)Tokens.LE; }&lt;br /&gt;
&amp;quot;&amp;gt;=&amp;quot; { return (int)Tokens.GE; }&lt;br /&gt;
&amp;quot;=&amp;quot; { return (int)Tokens.EQ; }&lt;br /&gt;
&amp;quot;&amp;lt;&amp;gt;&amp;quot; { return (int)Tokens.NE; }&lt;br /&gt;
&amp;quot;(&amp;quot; { return (int)Tokens.LPAREN; }&lt;br /&gt;
&amp;quot;)&amp;quot; { return (int)Tokens.RPAREN; }&lt;br /&gt;
&amp;quot;,&amp;quot; { return (int)Tokens.COLUMN; }&lt;br /&gt;
&amp;quot;:&amp;quot; { return (int)Tokens.COLON; }&lt;br /&gt;
&amp;quot;.&amp;quot; { return (int)Tokens.POINT;  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\'[^']*\' {&lt;br /&gt;
  yylval.sVal = yytext.Substring(1,yytext.Length-2);&lt;br /&gt;
  return (int)Tokens.STRINGLITERAL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{ID}  { &lt;br /&gt;
  int res = ScannerHelper.GetIDToken(yytext);&lt;br /&gt;
  string s = yytext.ToLower();&lt;br /&gt;
  if (s==&amp;quot;integer&amp;quot;)&lt;br /&gt;
    yylval.dtVal.DType=DataType.INTTYPE;&lt;br /&gt;
  if (s == &amp;quot;real&amp;quot;)&lt;br /&gt;
      yylval.dtVal.DType =DataType.DOUBLETYPE;&lt;br /&gt;
  if (res == (int)Tokens.ID)&lt;br /&gt;
	yylval.sVal = yytext;&lt;br /&gt;
  return res;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{INTNUM} { &lt;br /&gt;
  yylval.iVal = int.Parse(yytext); &lt;br /&gt;
  return (int)Tokens.INTNUM; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{REALNUM} { &lt;br /&gt;
  yylval.dVal = double.Parse(yytext,new System.Globalization.CultureInfo(&amp;quot;en-US&amp;quot;)); &lt;br /&gt;
  return (int)Tokens.REALNUM; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
%{&lt;br /&gt;
  yylloc = new LexLocation(tokLin, tokCol, tokELin, tokECol);&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
class ScannerHelper &lt;br /&gt;
{&lt;br /&gt;
  private static Dictionary&amp;lt;string,int&amp;gt; keywords;&lt;br /&gt;
&lt;br /&gt;
  static ScannerHelper() &lt;br /&gt;
  {&lt;br /&gt;
    keywords = new Dictionary&amp;lt;string,int&amp;gt;();&lt;br /&gt;
    keywords.Add(&amp;quot;var&amp;quot;,(int)Tokens.kVAR);&lt;br /&gt;
    keywords.Add(&amp;quot;real&amp;quot;,(int)Tokens.kREAL);&lt;br /&gt;
    keywords.Add(&amp;quot;integer&amp;quot;,(int)Tokens.kINTEGER);&lt;br /&gt;
    keywords.Add(&amp;quot;begin&amp;quot;,(int)Tokens.kBEGIN);&lt;br /&gt;
    keywords.Add(&amp;quot;end&amp;quot;,(int)Tokens.kEND);&lt;br /&gt;
    keywords.Add(&amp;quot;if&amp;quot;,(int)Tokens.kIF);&lt;br /&gt;
    keywords.Add(&amp;quot;then&amp;quot;,(int)Tokens.kTHEN);&lt;br /&gt;
    keywords.Add(&amp;quot;else&amp;quot;,(int)Tokens.kELSE);&lt;br /&gt;
    keywords.Add(&amp;quot;do&amp;quot;,(int)Tokens.kDO);&lt;br /&gt;
    keywords.Add(&amp;quot;while&amp;quot;,(int)Tokens.kWHILE);&lt;br /&gt;
    keywords.Add(&amp;quot;div&amp;quot;,(int)Tokens.DIV);&lt;br /&gt;
    keywords.Add(&amp;quot;mod&amp;quot;,(int)Tokens.MOD);&lt;br /&gt;
    keywords.Add(&amp;quot;and&amp;quot;,(int)Tokens.AND);&lt;br /&gt;
    keywords.Add(&amp;quot;or&amp;quot;,(int)Tokens.OR);&lt;br /&gt;
    keywords.Add(&amp;quot;not&amp;quot;,(int)Tokens.NOT);				&lt;br /&gt;
  }&lt;br /&gt;
  public static int GetIDToken(string s)&lt;br /&gt;
  {&lt;br /&gt;
    s = s.ToLower();&lt;br /&gt;
	if (keywords.ContainsKey(s))&lt;br /&gt;
	{ &lt;br /&gt;
	  return keywords[s];&lt;br /&gt;
	}  &lt;br /&gt;
	else&lt;br /&gt;
      return (int)Tokens.ID;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2175</id>
		<title>Грамматика языка Pascal</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2175"/>
		<updated>2011-09-21T20:45:53Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Новый вариант'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
%union { &lt;br /&gt;
	 public int iVal; &lt;br /&gt;
	 public double dVal; &lt;br /&gt;
         public string sVal; &lt;br /&gt;
         public ExprNode eVal;&lt;br /&gt;
         public List&amp;lt;ExprNode&amp;gt; elVal;&lt;br /&gt;
         public TreeNode tVal;&lt;br /&gt;
         public BlockNode lVal;&lt;br /&gt;
         public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
	 public GreatType dtVal;&lt;br /&gt;
       }&lt;br /&gt;
%output=PascalYacc.cs &lt;br /&gt;
%using System.IO&lt;br /&gt;
%using Syntax_node_tree&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kDO kVAR&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON POINT  &lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; operator elsepart&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; listoperator progr &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; ident &lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : {}&lt;br /&gt;
	| defss kBEGIN listoperator kEND {}&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD TEXT!!!&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	} &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs &lt;br /&gt;
	|defss defs&lt;br /&gt;
	|&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR ident COLON ktype SEMICOLUMN {}&lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
ident   : ID {}	&lt;br /&gt;
        |ident COLUMN ID {}&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
listoperator    :   operator {}&lt;br /&gt;
	|   listoperator SEMICOLUMN operator {}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD GREATE TYPE&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL {} &lt;br /&gt;
	| kINTEGER {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
operator: {}&lt;br /&gt;
	| ID ASSIGN expr {}&lt;br /&gt;
	| kWHILE expr kDO operator {}&lt;br /&gt;
	operator {}&lt;br /&gt;
	| kIF expr kTHEN operator elsepart {}&lt;br /&gt;
	| kBEGIN listoperator kEND {}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {}&lt;br /&gt;
	| kELSE operator {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
exprlist : expr {}&lt;br /&gt;
	| exprlist COLUMN expr {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
expr:    INTNUM {}&lt;br /&gt;
        | REALNUM {}&lt;br /&gt;
        | STRINGLITERAL {}&lt;br /&gt;
        | ID {}    &lt;br /&gt;
    	| expr PLUS expr {}&lt;br /&gt;
    	| expr MINUS expr {}&lt;br /&gt;
    	| expr MULT expr {}&lt;br /&gt;
    	| expr DIVIDE expr {}&lt;br /&gt;
    	| expr DIV expr {}&lt;br /&gt;
    	| expr MOD expr {}&lt;br /&gt;
    	| expr AND expr {}&lt;br /&gt;
    	| expr OR expr {}&lt;br /&gt;
    	| expr LT expr {}&lt;br /&gt;
    	| expr GT expr {}&lt;br /&gt;
    	| expr LE expr {}&lt;br /&gt;
    	| expr GE expr {}&lt;br /&gt;
    	| expr EQ expr {}&lt;br /&gt;
    	| expr NE expr {}&lt;br /&gt;
    	| NOT expr {}&lt;br /&gt;
     	| MINUS expr %prec UMINUS {} &lt;br /&gt;
    	| LPAREN expr RPAREN {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Предварительный сканер'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%using Syntax_node_tree;&lt;br /&gt;
&lt;br /&gt;
Alpha 	[a-zA-Z_]&lt;br /&gt;
INTNUM  [0-9]+&lt;br /&gt;
REALNUM {INTNUM}\.{INTNUM}&lt;br /&gt;
ID [a-zA-Z_][a-zA-Z0-9_]* &lt;br /&gt;
&lt;br /&gt;
%x COMMENT&lt;br /&gt;
%x COMMENT1&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
&amp;quot;{&amp;quot; { BEGIN(COMMENT);}&lt;br /&gt;
&amp;lt;COMMENT&amp;gt; &amp;quot;}&amp;quot; { BEGIN(INITIAL);}&lt;br /&gt;
&amp;lt;COMMENT&amp;gt; &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt; { Console.WriteLine(&amp;quot;Комментарий не закрыт&amp;quot;);}&lt;br /&gt;
&amp;quot;(*&amp;quot; { BEGIN(COMMENT1);}&lt;br /&gt;
&amp;lt;COMMENT1&amp;gt; &amp;quot;*)&amp;quot; { BEGIN(INITIAL);}&lt;br /&gt;
&amp;lt;COMMENT1&amp;gt; &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt; { Console.WriteLine(&amp;quot;Комментарий не закрыт&amp;quot;);}&lt;br /&gt;
&lt;br /&gt;
&amp;quot;:=&amp;quot; { return (int)Tokens.ASSIGN; }&lt;br /&gt;
&amp;quot;;&amp;quot; { return (int)Tokens.SEMICOLUMN; }&lt;br /&gt;
&amp;quot;-&amp;quot; { return (int)Tokens.MINUS; }&lt;br /&gt;
&amp;quot;+&amp;quot; { return (int)Tokens.PLUS; }&lt;br /&gt;
&amp;quot;*&amp;quot; { return (int)Tokens.MULT; }&lt;br /&gt;
&amp;quot;/&amp;quot; { return (int)Tokens.DIVIDE; }&lt;br /&gt;
&amp;quot;&amp;lt;&amp;quot; { return (int)Tokens.LT; }&lt;br /&gt;
&amp;quot;&amp;gt;&amp;quot; { return (int)Tokens.GT; }&lt;br /&gt;
&amp;quot;&amp;lt;=&amp;quot; { return (int)Tokens.LE; }&lt;br /&gt;
&amp;quot;&amp;gt;=&amp;quot; { return (int)Tokens.GE; }&lt;br /&gt;
&amp;quot;=&amp;quot; { return (int)Tokens.EQ; }&lt;br /&gt;
&amp;quot;&amp;lt;&amp;gt;&amp;quot; { return (int)Tokens.NE; }&lt;br /&gt;
&amp;quot;(&amp;quot; { return (int)Tokens.LPAREN; }&lt;br /&gt;
&amp;quot;)&amp;quot; { return (int)Tokens.RPAREN; }&lt;br /&gt;
&amp;quot;,&amp;quot; { return (int)Tokens.COLUMN; }&lt;br /&gt;
&amp;quot;:&amp;quot; { return (int)Tokens.COLON; }&lt;br /&gt;
&amp;quot;.&amp;quot; { return (int)Tokens.POINT;  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\'[^']*\' {&lt;br /&gt;
  yylval.sVal = yytext.Substring(1,yytext.Length-2);&lt;br /&gt;
  return (int)Tokens.STRINGLITERAL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{ID}  { &lt;br /&gt;
  int res = ScannerHelper.GetIDToken(yytext);&lt;br /&gt;
  string s = yytext.ToLower();&lt;br /&gt;
  if (s==&amp;quot;integer&amp;quot;)&lt;br /&gt;
    yylval.dtVal.DType=DataType.INTTYPE;&lt;br /&gt;
  if (s == &amp;quot;real&amp;quot;)&lt;br /&gt;
      yylval.dtVal.DType =DataType.DOUBLETYPE;&lt;br /&gt;
  if (res == (int)Tokens.ID)&lt;br /&gt;
	yylval.sVal = yytext;&lt;br /&gt;
  return res;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{INTNUM} { &lt;br /&gt;
  yylval.iVal = int.Parse(yytext); &lt;br /&gt;
  return (int)Tokens.INTNUM; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{REALNUM} { &lt;br /&gt;
  yylval.dVal = double.Parse(yytext,new System.Globalization.CultureInfo(&amp;quot;en-US&amp;quot;)); &lt;br /&gt;
  return (int)Tokens.REALNUM; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
%{&lt;br /&gt;
  yylloc = new LexLocation(tokLin, tokCol, tokELin, tokECol);&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
class ScannerHelper &lt;br /&gt;
{&lt;br /&gt;
  private static Dictionary&amp;lt;string,int&amp;gt; keywords;&lt;br /&gt;
&lt;br /&gt;
  static ScannerHelper() &lt;br /&gt;
  {&lt;br /&gt;
    keywords = new Dictionary&amp;lt;string,int&amp;gt;();&lt;br /&gt;
    keywords.Add(&amp;quot;var&amp;quot;,(int)Tokens.kVAR);&lt;br /&gt;
    keywords.Add(&amp;quot;real&amp;quot;,(int)Tokens.kREAL);&lt;br /&gt;
    keywords.Add(&amp;quot;integer&amp;quot;,(int)Tokens.kINTEGER);&lt;br /&gt;
    keywords.Add(&amp;quot;begin&amp;quot;,(int)Tokens.kBEGIN);&lt;br /&gt;
    keywords.Add(&amp;quot;end&amp;quot;,(int)Tokens.kEND);&lt;br /&gt;
    keywords.Add(&amp;quot;if&amp;quot;,(int)Tokens.kIF);&lt;br /&gt;
    keywords.Add(&amp;quot;then&amp;quot;,(int)Tokens.kTHEN);&lt;br /&gt;
    keywords.Add(&amp;quot;else&amp;quot;,(int)Tokens.kELSE);&lt;br /&gt;
    keywords.Add(&amp;quot;do&amp;quot;,(int)Tokens.kDO);&lt;br /&gt;
    keywords.Add(&amp;quot;while&amp;quot;,(int)Tokens.kWHILE);&lt;br /&gt;
    keywords.Add(&amp;quot;div&amp;quot;,(int)Tokens.DIV);&lt;br /&gt;
    keywords.Add(&amp;quot;mod&amp;quot;,(int)Tokens.MOD);&lt;br /&gt;
    keywords.Add(&amp;quot;and&amp;quot;,(int)Tokens.AND);&lt;br /&gt;
    keywords.Add(&amp;quot;or&amp;quot;,(int)Tokens.OR);&lt;br /&gt;
    keywords.Add(&amp;quot;not&amp;quot;,(int)Tokens.NOT);				&lt;br /&gt;
  }&lt;br /&gt;
  public static int GetIDToken(string s)&lt;br /&gt;
  {&lt;br /&gt;
    s = s.ToLower();&lt;br /&gt;
	if (keywords.ContainsKey(s))&lt;br /&gt;
	{ &lt;br /&gt;
	  return keywords[s];&lt;br /&gt;
	}  &lt;br /&gt;
	else&lt;br /&gt;
      return (int)Tokens.ID;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2174</id>
		<title>Грамматика языка Pascal</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2174"/>
		<updated>2011-09-21T20:38:31Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Новый вариант'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
%union { &lt;br /&gt;
	 public int iVal; &lt;br /&gt;
	 public double dVal; &lt;br /&gt;
         public string sVal; &lt;br /&gt;
         public ExprNode eVal;&lt;br /&gt;
         public List&amp;lt;ExprNode&amp;gt; elVal;&lt;br /&gt;
         public TreeNode tVal;&lt;br /&gt;
         public BlockNode lVal;&lt;br /&gt;
         public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
	 public GreatType dtVal;&lt;br /&gt;
       }&lt;br /&gt;
%output=PascalYacc.cs &lt;br /&gt;
%using System.IO&lt;br /&gt;
%using Syntax_node_tree&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kDO kVAR&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON POINT  &lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; operator elsepart&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; listoperator progr &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; ident &lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : {}&lt;br /&gt;
	| defss kBEGIN listoperator kEND {}&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD TEXT!!!&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	} &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs &lt;br /&gt;
	|defss defs&lt;br /&gt;
	|&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR ident COLON ktype SEMICOLUMN {}&lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
ident   : ID {}	&lt;br /&gt;
        |ident COLUMN ID {}&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
listoperator    :   operator {}&lt;br /&gt;
	|   listoperator SEMICOLUMN operator {}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD GREATE TYPE&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL {} &lt;br /&gt;
	| kINTEGER {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
operator: {}&lt;br /&gt;
	| ID ASSIGN expr {}&lt;br /&gt;
	| kWHILE expr kDO operator {}&lt;br /&gt;
	operator {}&lt;br /&gt;
	| kIF expr kTHEN operator elsepart {}&lt;br /&gt;
	| kBEGIN listoperator kEND {}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {}&lt;br /&gt;
	| kELSE operator {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
exprlist : expr {}&lt;br /&gt;
	| exprlist COLUMN expr {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
expr:    INTNUM {}&lt;br /&gt;
        | REALNUM {}&lt;br /&gt;
        | STRINGLITERAL {}&lt;br /&gt;
        | ID {}    &lt;br /&gt;
    	| expr PLUS expr {}&lt;br /&gt;
    	| expr MINUS expr {}&lt;br /&gt;
    	| expr MULT expr {}&lt;br /&gt;
    	| expr DIVIDE expr {}&lt;br /&gt;
    	| expr DIV expr {}&lt;br /&gt;
    	| expr MOD expr {}&lt;br /&gt;
    	| expr AND expr {}&lt;br /&gt;
    	| expr OR expr {}&lt;br /&gt;
    	| expr LT expr {}&lt;br /&gt;
    	| expr GT expr {}&lt;br /&gt;
    	| expr LE expr {}&lt;br /&gt;
    	| expr GE expr {}&lt;br /&gt;
    	| expr EQ expr {}&lt;br /&gt;
    	| expr NE expr {}&lt;br /&gt;
    	| NOT expr {}&lt;br /&gt;
     	| MINUS expr %prec UMINUS {} &lt;br /&gt;
    	| LPAREN expr RPAREN {}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2162</id>
		<title>Грамматика языка Pascal</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2162"/>
		<updated>2011-09-15T11:33:26Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%output=myyacc.cs &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%union &lt;br /&gt;
{ &lt;br /&gt;
   public double dVal; &lt;br /&gt;
   public string sVal; &lt;br /&gt;
   public int iVal; &lt;br /&gt;
   public ExprNode eVal;&lt;br /&gt;
   public List&amp;lt;ExprNode&amp;gt; elVal;         &lt;br /&gt;
   public TreeNode tVal;&lt;br /&gt;
   public BlockNode lVal;	 &lt;br /&gt;
   public GreatType dtVal;         &lt;br /&gt;
   public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%using System.IO&lt;br /&gt;
%using SimpleCompiler&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kREPEAT kUNTIL kFOR kTO kDO kVAR kOF kARRAY&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON LQPAREN RQPAREN MPOINT POINT  &lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
%type &amp;lt;iVal&amp;gt; funcid&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr funccall&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; stat elsepart&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; liststat progr&lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; listid &lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : defss kBEGIN liststat kEND &lt;br /&gt;
	| error  &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs &lt;br /&gt;
	|defss defs&lt;br /&gt;
        |&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR listid COLON ktype SEMICOLUMN &lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
listid  : ID	&lt;br /&gt;
	|listid COLUMN ID &lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
liststat    :   stat &lt;br /&gt;
	|   liststat SEMICOLUMN stat &lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType	&lt;br /&gt;
	| error &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL &lt;br /&gt;
	| kINTEGER &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
stat: { $$ = new Node(@$);}&lt;br /&gt;
	| ID ASSIGN expr &lt;br /&gt;
	| ID LQPAREN expr RQPAREN ASSIGN expr&lt;br /&gt;
	| kWHILE expr kDO stat&lt;br /&gt;
	| kIF expr kTHEN stat elsepart&lt;br /&gt;
	{&lt;br /&gt;
		$$ = new IfNode($2,$4,$5,@$);&lt;br /&gt;
	}&lt;br /&gt;
	| kBEGIN liststat kEND { $$ = $2;}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {$$ = null;}&lt;br /&gt;
	| kELSE stat&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
exprlist : expr &lt;br /&gt;
	 | exprlist COLUMN expr&lt;br /&gt;
	 ;&lt;br /&gt;
&lt;br /&gt;
expr:    INTNUM&lt;br /&gt;
       | REALNUM   &lt;br /&gt;
       | ID&lt;br /&gt;
       | ID LQPAREN expr RQPAREN   &lt;br /&gt;
       | expr PLUS expr&lt;br /&gt;
       | expr MINUS expr &lt;br /&gt;
       | expr MULT expr   &lt;br /&gt;
       | expr DIVIDE expr  &lt;br /&gt;
       | expr DIV expr&lt;br /&gt;
       | expr MOD expr    &lt;br /&gt;
       | expr AND expr&lt;br /&gt;
       | expr OR expr   &lt;br /&gt;
       | expr LT expr&lt;br /&gt;
       | expr GT expr  &lt;br /&gt;
       | expr LE expr  &lt;br /&gt;
       | expr GE expr  &lt;br /&gt;
       | expr EQ expr  &lt;br /&gt;
       | expr NE expr  &lt;br /&gt;
       | NOT expr &lt;br /&gt;
       | MINUS expr %prec UMINUS&lt;br /&gt;
       | LPAREN expr RPAREN&lt;br /&gt;
       ;&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2158</id>
		<title>Грамматика языка Pascal</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2158"/>
		<updated>2011-09-15T11:29:46Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%output=myyacc.cs &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%union { &lt;br /&gt;
&lt;br /&gt;
public double dVal; &lt;br /&gt;
         &lt;br /&gt;
public string sVal; &lt;br /&gt;
        &lt;br /&gt;
public int iVal; &lt;br /&gt;
         &lt;br /&gt;
public ExprNode eVal;&lt;br /&gt;
         &lt;br /&gt;
public List&amp;lt;ExprNode&amp;gt; elVal;&lt;br /&gt;
         &lt;br /&gt;
public TreeNode tVal;&lt;br /&gt;
         &lt;br /&gt;
public BlockNode lVal;&lt;br /&gt;
	 &lt;br /&gt;
public GreatType dtVal;&lt;br /&gt;
         &lt;br /&gt;
public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%using System.IO&lt;br /&gt;
&lt;br /&gt;
%using SimpleCompiler&lt;br /&gt;
&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kREPEAT kUNTIL kFOR kTO kDO kVAR kOF kARRAY&lt;br /&gt;
&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON LQPAREN RQPAREN MPOINT POINT  &lt;br /&gt;
&lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
&lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;iVal&amp;gt; funcid&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr funccall&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; stat elsepart&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; liststat progr&lt;br /&gt;
 &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; listid &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : defss kBEGIN liststat kEND &lt;br /&gt;
&lt;br /&gt;
	| error  &lt;br /&gt;
&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs &lt;br /&gt;
&lt;br /&gt;
	|defss defs&lt;br /&gt;
&lt;br /&gt;
	|&lt;br /&gt;
&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR listid COLON ktype SEMICOLUMN &lt;br /&gt;
&lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
listid  : ID	&lt;br /&gt;
&lt;br /&gt;
	|listid COLUMN ID &lt;br /&gt;
&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
liststat    :   stat &lt;br /&gt;
&lt;br /&gt;
	|   liststat SEMICOLUMN stat &lt;br /&gt;
&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType&lt;br /&gt;
	&lt;br /&gt;
	| error &lt;br /&gt;
&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL &lt;br /&gt;
&lt;br /&gt;
	| kINTEGER &lt;br /&gt;
&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
stat: { $$ = new Node(@$);}&lt;br /&gt;
&lt;br /&gt;
	| ID ASSIGN expr &lt;br /&gt;
&lt;br /&gt;
	| ID LQPAREN expr RQPAREN ASSIGN expr&lt;br /&gt;
&lt;br /&gt;
	| kWHILE expr kDO stat&lt;br /&gt;
&lt;br /&gt;
	| kIF expr kTHEN stat elsepart&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		$$ = new IfNode($2,$4,$5,@$);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	| kBEGIN liststat kEND { $$ = $2;}&lt;br /&gt;
&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {$$ = null;}&lt;br /&gt;
&lt;br /&gt;
	| kELSE stat&lt;br /&gt;
&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
exprlist : expr &lt;br /&gt;
&lt;br /&gt;
	 | exprlist COLUMN expr&lt;br /&gt;
&lt;br /&gt;
	 ;&lt;br /&gt;
&lt;br /&gt;
expr:    INTNUM&lt;br /&gt;
&lt;br /&gt;
       | REALNUM   &lt;br /&gt;
  &lt;br /&gt;
       | ID&lt;br /&gt;
&lt;br /&gt;
       | ID LQPAREN expr RQPAREN   &lt;br /&gt;
     &lt;br /&gt;
       | expr PLUS expr&lt;br /&gt;
&lt;br /&gt;
       | expr MINUS expr &lt;br /&gt;
      &lt;br /&gt;
       | expr MULT expr   &lt;br /&gt;
    &lt;br /&gt;
       | expr DIVIDE expr  &lt;br /&gt;
      &lt;br /&gt;
       | expr DIV expr&lt;br /&gt;
&lt;br /&gt;
       | expr MOD expr    &lt;br /&gt;
    &lt;br /&gt;
       | expr AND expr&lt;br /&gt;
&lt;br /&gt;
       | expr OR expr   &lt;br /&gt;
    &lt;br /&gt;
       | expr LT expr&lt;br /&gt;
&lt;br /&gt;
       | expr GT expr  &lt;br /&gt;
     &lt;br /&gt;
       | expr LE expr &lt;br /&gt;
       &lt;br /&gt;
       | expr GE expr  &lt;br /&gt;
      &lt;br /&gt;
       | expr EQ expr  &lt;br /&gt;
      &lt;br /&gt;
       | expr NE expr  &lt;br /&gt;
     &lt;br /&gt;
       | NOT expr &lt;br /&gt;
&lt;br /&gt;
       | MINUS expr %prec UMINUS&lt;br /&gt;
&lt;br /&gt;
       | LPAREN expr RPAREN&lt;br /&gt;
&lt;br /&gt;
       ;&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2157</id>
		<title>Грамматика языка Pascal</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2157"/>
		<updated>2011-09-15T11:28:11Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%output=myyacc.cs &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%union { &lt;br /&gt;
&lt;br /&gt;
public double dVal; &lt;br /&gt;
         &lt;br /&gt;
public string sVal; &lt;br /&gt;
        &lt;br /&gt;
public int iVal; &lt;br /&gt;
         &lt;br /&gt;
public ExprNode eVal;&lt;br /&gt;
         &lt;br /&gt;
public List&amp;lt;ExprNode&amp;gt; elVal;&lt;br /&gt;
         &lt;br /&gt;
public TreeNode tVal;&lt;br /&gt;
         &lt;br /&gt;
public BlockNode lVal;&lt;br /&gt;
	 &lt;br /&gt;
public GreatType dtVal;&lt;br /&gt;
         &lt;br /&gt;
public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%using System.IO&lt;br /&gt;
&lt;br /&gt;
%using SimpleCompiler&lt;br /&gt;
&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kREPEAT kUNTIL kFOR kTO kDO kVAR kOF kARRAY&lt;br /&gt;
&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON LQPAREN RQPAREN MPOINT POINT  &lt;br /&gt;
&lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
&lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;iVal&amp;gt; funcid&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr funccall&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; stat elsepart&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; liststat progr&lt;br /&gt;
 &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; listid &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : defss kBEGIN liststat kEND &lt;br /&gt;
&lt;br /&gt;
	| error  &lt;br /&gt;
&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs &lt;br /&gt;
&lt;br /&gt;
	|defss defs&lt;br /&gt;
&lt;br /&gt;
	|&lt;br /&gt;
&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR listid COLON ktype SEMICOLUMN &lt;br /&gt;
&lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
listid  : ID	&lt;br /&gt;
&lt;br /&gt;
	|listid COLUMN ID &lt;br /&gt;
&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
liststat    :   stat &lt;br /&gt;
&lt;br /&gt;
	|   liststat SEMICOLUMN stat &lt;br /&gt;
&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType&lt;br /&gt;
	&lt;br /&gt;
	| error &lt;br /&gt;
&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL &lt;br /&gt;
&lt;br /&gt;
	| kINTEGER &lt;br /&gt;
&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
stat: { $$ = new Node(@$);}&lt;br /&gt;
&lt;br /&gt;
	| ID ASSIGN expr &lt;br /&gt;
&lt;br /&gt;
	| ID LQPAREN expr RQPAREN ASSIGN expr&lt;br /&gt;
&lt;br /&gt;
	| kWHILE expr kDO stat&lt;br /&gt;
&lt;br /&gt;
	| kIF expr kTHEN stat elsepart&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		$$ = new IfNode($2,$4,$5,@$);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	| kBEGIN liststat kEND { $$ = $2;}&lt;br /&gt;
&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {$$ = null;}&lt;br /&gt;
&lt;br /&gt;
	| kELSE stat&lt;br /&gt;
&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
exprlist : expr &lt;br /&gt;
&lt;br /&gt;
	 | exprlist COLUMN expr&lt;br /&gt;
&lt;br /&gt;
	 ;&lt;br /&gt;
&lt;br /&gt;
expr:    INTNUM&lt;br /&gt;
&lt;br /&gt;
       | REALNUM   &lt;br /&gt;
  &lt;br /&gt;
       | ID&lt;br /&gt;
&lt;br /&gt;
       | ID LQPAREN expr RQPAREN   &lt;br /&gt;
     &lt;br /&gt;
       | expr PLUS expr&lt;br /&gt;
&lt;br /&gt;
       | expr MINUS expr &lt;br /&gt;
      &lt;br /&gt;
       | expr MULT expr   &lt;br /&gt;
    &lt;br /&gt;
       | expr DIVIDE expr  &lt;br /&gt;
      &lt;br /&gt;
       | expr DIV expr&lt;br /&gt;
&lt;br /&gt;
       | expr MOD expr    &lt;br /&gt;
    &lt;br /&gt;
       | expr AND expr&lt;br /&gt;
&lt;br /&gt;
       | expr OR expr   &lt;br /&gt;
    &lt;br /&gt;
       | expr LT expr&lt;br /&gt;
&lt;br /&gt;
       | expr GT expr  &lt;br /&gt;
     &lt;br /&gt;
       | expr LE expr &lt;br /&gt;
       &lt;br /&gt;
       | expr GE expr  &lt;br /&gt;
      &lt;br /&gt;
       | expr EQ expr  &lt;br /&gt;
      &lt;br /&gt;
       | expr NE expr  &lt;br /&gt;
     &lt;br /&gt;
       | NOT expr &lt;br /&gt;
&lt;br /&gt;
       | MINUS expr %prec UMINUS&lt;br /&gt;
&lt;br /&gt;
       | LPAREN expr RPAREN&lt;br /&gt;
&lt;br /&gt;
       ;&lt;br /&gt;
&lt;br /&gt;
%%&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2152</id>
		<title>Грамматика языка Pascal</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2152"/>
		<updated>2011-09-15T11:20:33Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%output=myyacc.cs &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%union { &lt;br /&gt;
&lt;br /&gt;
public double dVal; &lt;br /&gt;
         &lt;br /&gt;
public string sVal; &lt;br /&gt;
        &lt;br /&gt;
public int iVal; &lt;br /&gt;
         &lt;br /&gt;
public ExprNode eVal;&lt;br /&gt;
         &lt;br /&gt;
public List&amp;lt;ExprNode&amp;gt; elVal;&lt;br /&gt;
         &lt;br /&gt;
public TreeNode tVal;&lt;br /&gt;
         &lt;br /&gt;
public BlockNode lVal;&lt;br /&gt;
	 &lt;br /&gt;
public GreatType dtVal;&lt;br /&gt;
         &lt;br /&gt;
public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%using System.IO&lt;br /&gt;
&lt;br /&gt;
%using SimpleCompiler&lt;br /&gt;
&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kREPEAT kUNTIL kFOR kTO kDO kVAR kOF kARRAY&lt;br /&gt;
&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON LQPAREN RQPAREN MPOINT POINT  &lt;br /&gt;
&lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
&lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;iVal&amp;gt; funcid&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr funccall&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; stat elsepart&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; liststat progr&lt;br /&gt;
 &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; listid &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : defss kBEGIN liststat kEND &lt;br /&gt;
	| error  &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs &lt;br /&gt;
	|defss defs&lt;br /&gt;
	|&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR listid COLON ktype SEMICOLUMN &lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
listid  : ID	&lt;br /&gt;
	|listid COLUMN ID &lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
liststat    :   stat &lt;br /&gt;
	|   liststat SEMICOLUMN stat &lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType	&lt;br /&gt;
	| error &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL &lt;br /&gt;
	| kINTEGER &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
stat: { $$ = new Node(@$);}&lt;br /&gt;
	| ID ASSIGN expr &lt;br /&gt;
	| ID LQPAREN expr RQPAREN ASSIGN expr&lt;br /&gt;
	| kWHILE expr kDO stat&lt;br /&gt;
	| kIF expr kTHEN stat elsepart&lt;br /&gt;
	{&lt;br /&gt;
		$$ = new IfNode($2,$4,$5,@$);&lt;br /&gt;
	}&lt;br /&gt;
	| kBEGIN liststat kEND { $$ = $2;}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {$$ = null;}&lt;br /&gt;
	| kELSE stat&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
exprlist : expr &lt;br /&gt;
	 | exprlist COLUMN expr&lt;br /&gt;
	 ;&lt;br /&gt;
&lt;br /&gt;
expr:    INTNUM&lt;br /&gt;
       | REALNUM     &lt;br /&gt;
       | ID&lt;br /&gt;
       | ID LQPAREN expr RQPAREN        &lt;br /&gt;
       | expr PLUS expr&lt;br /&gt;
       | expr MINUS expr       &lt;br /&gt;
       | expr MULT expr       &lt;br /&gt;
       | expr DIVIDE expr        &lt;br /&gt;
       | expr DIV expr&lt;br /&gt;
       | expr MOD expr        &lt;br /&gt;
       | expr AND expr&lt;br /&gt;
       | expr OR expr       &lt;br /&gt;
       | expr LT expr&lt;br /&gt;
       | expr GT expr       &lt;br /&gt;
       | expr LE expr        &lt;br /&gt;
       | expr GE expr        &lt;br /&gt;
       | expr EQ expr        &lt;br /&gt;
       | expr NE expr       &lt;br /&gt;
       | NOT expr &lt;br /&gt;
       | MINUS expr %prec UMINUS&lt;br /&gt;
       | LPAREN expr RPAREN&lt;br /&gt;
       ;&lt;br /&gt;
&lt;br /&gt;
%%&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2151</id>
		<title>Грамматика языка Pascal</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2151"/>
		<updated>2011-09-15T11:19:47Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%output=myyacc.cs &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%union { public double dVal; &lt;br /&gt;
         public string sVal; &lt;br /&gt;
         public int iVal; &lt;br /&gt;
         public ExprNode eVal;&lt;br /&gt;
         public List&amp;lt;ExprNode&amp;gt; elVal;&lt;br /&gt;
         public TreeNode tVal;&lt;br /&gt;
         public BlockNode lVal;&lt;br /&gt;
	 public GreatType dtVal;&lt;br /&gt;
         public List&amp;lt;string&amp;gt; lsVal;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%using System.IO&lt;br /&gt;
&lt;br /&gt;
%using SimpleCompiler&lt;br /&gt;
&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kREPEAT kUNTIL kFOR kTO kDO kVAR kOF kARRAY&lt;br /&gt;
&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON LQPAREN RQPAREN MPOINT POINT  &lt;br /&gt;
&lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
&lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;iVal&amp;gt; funcid&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr funccall&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; stat elsepart&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; liststat progr&lt;br /&gt;
 &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; listid &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : defss kBEGIN liststat kEND &lt;br /&gt;
	| error  &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs &lt;br /&gt;
	|defss defs&lt;br /&gt;
	|&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR listid COLON ktype SEMICOLUMN &lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
listid  : ID	&lt;br /&gt;
	|listid COLUMN ID &lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
liststat    :   stat &lt;br /&gt;
	|   liststat SEMICOLUMN stat &lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType	&lt;br /&gt;
	| error &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL &lt;br /&gt;
	| kINTEGER &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
stat: { $$ = new Node(@$);}&lt;br /&gt;
	| ID ASSIGN expr &lt;br /&gt;
	| ID LQPAREN expr RQPAREN ASSIGN expr&lt;br /&gt;
	| kWHILE expr kDO stat&lt;br /&gt;
	| kIF expr kTHEN stat elsepart&lt;br /&gt;
	{&lt;br /&gt;
		$$ = new IfNode($2,$4,$5,@$);&lt;br /&gt;
	}&lt;br /&gt;
	| kBEGIN liststat kEND { $$ = $2;}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {$$ = null;}&lt;br /&gt;
	| kELSE stat&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
exprlist : expr &lt;br /&gt;
	 | exprlist COLUMN expr&lt;br /&gt;
	 ;&lt;br /&gt;
&lt;br /&gt;
expr:    INTNUM&lt;br /&gt;
       | REALNUM     &lt;br /&gt;
       | ID&lt;br /&gt;
       | ID LQPAREN expr RQPAREN        &lt;br /&gt;
       | expr PLUS expr&lt;br /&gt;
       | expr MINUS expr       &lt;br /&gt;
       | expr MULT expr       &lt;br /&gt;
       | expr DIVIDE expr        &lt;br /&gt;
       | expr DIV expr&lt;br /&gt;
       | expr MOD expr        &lt;br /&gt;
       | expr AND expr&lt;br /&gt;
       | expr OR expr       &lt;br /&gt;
       | expr LT expr&lt;br /&gt;
       | expr GT expr       &lt;br /&gt;
       | expr LE expr        &lt;br /&gt;
       | expr GE expr        &lt;br /&gt;
       | expr EQ expr        &lt;br /&gt;
       | expr NE expr       &lt;br /&gt;
       | NOT expr &lt;br /&gt;
       | MINUS expr %prec UMINUS&lt;br /&gt;
       | LPAREN expr RPAREN&lt;br /&gt;
       ;&lt;br /&gt;
&lt;br /&gt;
%%&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2150</id>
		<title>Грамматика языка Pascal</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2150"/>
		<updated>2011-09-15T11:19:03Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%output=myyacc.cs &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%union { public double dVal; &lt;br /&gt;
         public string sVal; &lt;br /&gt;
         public int iVal; &lt;br /&gt;
         public ExprNode eVal;&lt;br /&gt;
         public List&amp;lt;ExprNode&amp;gt; elVal;&lt;br /&gt;
         public TreeNode tVal;&lt;br /&gt;
         public BlockNode lVal;&lt;br /&gt;
         public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
	 public GreatType dtVal;&lt;br /&gt;
         }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%using System.IO&lt;br /&gt;
&lt;br /&gt;
%using SimpleCompiler&lt;br /&gt;
&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kREPEAT kUNTIL kFOR kTO kDO kVAR kOF kARRAY&lt;br /&gt;
&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON LQPAREN RQPAREN MPOINT POINT  &lt;br /&gt;
&lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
&lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;iVal&amp;gt; funcid&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr funccall&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; stat elsepart&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; liststat progr&lt;br /&gt;
 &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; listid &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : defss kBEGIN liststat kEND &lt;br /&gt;
	| error  &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs &lt;br /&gt;
	|defss defs&lt;br /&gt;
	|&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR listid COLON ktype SEMICOLUMN &lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
listid  : ID	&lt;br /&gt;
	|listid COLUMN ID &lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
liststat    :   stat &lt;br /&gt;
	|   liststat SEMICOLUMN stat &lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType	&lt;br /&gt;
	| error &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL &lt;br /&gt;
	| kINTEGER &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
stat: { $$ = new Node(@$);}&lt;br /&gt;
	| ID ASSIGN expr &lt;br /&gt;
	| ID LQPAREN expr RQPAREN ASSIGN expr&lt;br /&gt;
	| kWHILE expr kDO stat&lt;br /&gt;
	| kIF expr kTHEN stat elsepart&lt;br /&gt;
	{&lt;br /&gt;
		$$ = new IfNode($2,$4,$5,@$);&lt;br /&gt;
	}&lt;br /&gt;
	| kBEGIN liststat kEND { $$ = $2;}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {$$ = null;}&lt;br /&gt;
	| kELSE stat&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
exprlist : expr &lt;br /&gt;
	 | exprlist COLUMN expr&lt;br /&gt;
	 ;&lt;br /&gt;
&lt;br /&gt;
expr:    INTNUM&lt;br /&gt;
       | REALNUM     &lt;br /&gt;
       | ID&lt;br /&gt;
       | ID LQPAREN expr RQPAREN        &lt;br /&gt;
       | expr PLUS expr&lt;br /&gt;
       | expr MINUS expr       &lt;br /&gt;
       | expr MULT expr       &lt;br /&gt;
       | expr DIVIDE expr        &lt;br /&gt;
       | expr DIV expr&lt;br /&gt;
       | expr MOD expr        &lt;br /&gt;
       | expr AND expr&lt;br /&gt;
       | expr OR expr       &lt;br /&gt;
       | expr LT expr&lt;br /&gt;
       | expr GT expr       &lt;br /&gt;
       | expr LE expr        &lt;br /&gt;
       | expr GE expr        &lt;br /&gt;
       | expr EQ expr        &lt;br /&gt;
       | expr NE expr       &lt;br /&gt;
       | NOT expr &lt;br /&gt;
       | MINUS expr %prec UMINUS&lt;br /&gt;
       | LPAREN expr RPAREN&lt;br /&gt;
       ;&lt;br /&gt;
&lt;br /&gt;
%%&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2149</id>
		<title>Грамматика языка Pascal</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Pascal&amp;diff=2149"/>
		<updated>2011-09-15T11:18:19Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: Выложил грамматику языка Pascal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%output=myyacc.cs &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%union { public double dVal; &lt;br /&gt;
         public string sVal; &lt;br /&gt;
         public int iVal; &lt;br /&gt;
         public ExprNode eVal;&lt;br /&gt;
         public List&amp;lt;ExprNode&amp;gt; elVal;&lt;br /&gt;
         public TreeNode tVal;&lt;br /&gt;
         public BlockNode lVal;&lt;br /&gt;
         public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
         //public DataType dtVal.DType;&lt;br /&gt;
	 public GreatType dtVal;&lt;br /&gt;
         }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%using System.IO&lt;br /&gt;
&lt;br /&gt;
%using SimpleCompiler&lt;br /&gt;
&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kREPEAT kUNTIL kFOR kTO kDO kVAR kOF kARRAY&lt;br /&gt;
&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON LQPAREN RQPAREN MPOINT POINT  &lt;br /&gt;
&lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
&lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;iVal&amp;gt; funcid&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr funccall&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; stat elsepart&lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; liststat progr&lt;br /&gt;
 &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; listid &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : defss kBEGIN liststat kEND &lt;br /&gt;
	| error  &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs &lt;br /&gt;
	|defss defs&lt;br /&gt;
	|&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR listid COLON ktype SEMICOLUMN &lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
listid  : ID	&lt;br /&gt;
	|listid COLUMN ID &lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
liststat    :   stat &lt;br /&gt;
	|   liststat SEMICOLUMN stat &lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType	&lt;br /&gt;
	| error &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL &lt;br /&gt;
	| kINTEGER &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
stat: { $$ = new Node(@$);}&lt;br /&gt;
	| ID ASSIGN expr &lt;br /&gt;
	| ID LQPAREN expr RQPAREN ASSIGN expr&lt;br /&gt;
	| kWHILE expr kDO stat&lt;br /&gt;
	| kIF expr kTHEN stat elsepart&lt;br /&gt;
	{&lt;br /&gt;
		$$ = new IfNode($2,$4,$5,@$);&lt;br /&gt;
	}&lt;br /&gt;
	| kBEGIN liststat kEND { $$ = $2;}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {$$ = null;}&lt;br /&gt;
	| kELSE stat&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
exprlist : expr &lt;br /&gt;
	 | exprlist COLUMN expr&lt;br /&gt;
	 ;&lt;br /&gt;
&lt;br /&gt;
expr:    INTNUM&lt;br /&gt;
       | REALNUM     &lt;br /&gt;
       | ID&lt;br /&gt;
       | ID LQPAREN expr RQPAREN        &lt;br /&gt;
       | expr PLUS expr&lt;br /&gt;
       | expr MINUS expr       &lt;br /&gt;
       | expr MULT expr       &lt;br /&gt;
       | expr DIVIDE expr        &lt;br /&gt;
       | expr DIV expr&lt;br /&gt;
       | expr MOD expr        &lt;br /&gt;
       | expr AND expr&lt;br /&gt;
       | expr OR expr       &lt;br /&gt;
       | expr LT expr&lt;br /&gt;
       | expr GT expr       &lt;br /&gt;
       | expr LE expr        &lt;br /&gt;
       | expr GE expr        &lt;br /&gt;
       | expr EQ expr        &lt;br /&gt;
       | expr NE expr       &lt;br /&gt;
       | NOT expr &lt;br /&gt;
       | MINUS expr %prec UMINUS&lt;br /&gt;
       | LPAREN expr RPAREN&lt;br /&gt;
       ;&lt;br /&gt;
&lt;br /&gt;
%%&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2148</id>
		<title>МПОК 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2148"/>
		<updated>2011-09-15T11:02:25Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Роли в проекте и задания разработчикам 2011]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка Pascal]]&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2147</id>
		<title>МПОК 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2147"/>
		<updated>2011-09-15T11:02:12Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Роли в проекте и задания разработчикам 2011]]&lt;br /&gt;
[[Грамматика языка Pascal]]&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1088</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1088"/>
		<updated>2009-12-08T13:38:19Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Атрибут AddinRoot может быть использован для отметки сборки настройки  add-in host. TypeExtensionPoint этот атрибут описывает новую точку расширения с определенным путем для конструктора, и требует узлы типа TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Addin этот атрибут указывает на сборку add-in. Для этого может использоваться идентификатор или версия при необходимости.&lt;br /&gt;
AddinDependency- атрибут описывающий зависимости TextEditor от add-in host.&lt;br /&gt;
Extensio- атрибут указывающий class extension.&lt;br /&gt;
Для этого регистрируем узел расширения с типом TypeExtensionNode с указанием пути.&lt;br /&gt;
&lt;br /&gt;
'''Архитектура приложения расширения.'''&lt;br /&gt;
&lt;br /&gt;
Приложение расширения, состоит как минимум из одной сборки выполнения и одной библиотеки. Mono.Addins основывается на так называемой сильно типизированной модели. Эта модель нуждается в точном объявлени всех точек расширения и иныормации их согласования. Вся эта информация составляет '''add-in root''' (корневой add-in).&lt;br /&gt;
&lt;br /&gt;
'''Add-in roots'''&lt;br /&gt;
&lt;br /&gt;
Приложения расширения доложны объявлять один, как минимум add-in root, но при необходимости могут объявлять и больше.Определив нсколько add-in roots для приложения состоящего из нескольких модулей. Это один из возможных путей, использования инструмента add-ins , основанный на специфике модулей приложения.например мощь инструмента приложении в логике, в одной сборке и GUI в другой. &lt;br /&gt;
&lt;br /&gt;
В порядке разрешения этих типов архитектуры, add-in roots должен иметь уникальный идентификатор.Add-ins  должен ссылаться на этот ID(идентификатор add-in root).Add-in roots  так же имеет номер версии, который используется для поддержания логичности между точками расширения, им используемыми, и расширения представляемых add-ins.&lt;br /&gt;
&lt;br /&gt;
Add-in roots могут связывать одну или несколько сборок, которые могут быть выполняемыми или библиотеками. Сложные приложения состоят обычно из нескольких сборок,поэтому важно тщательно определять, что является add-in root, а что нет.&lt;br /&gt;
&lt;br /&gt;
[картика]&lt;br /&gt;
&lt;br /&gt;
В данном примере приложение состоит из 2-х файлов: консольного и графического приложения.Приложение определяет 2 add-in roots:&lt;br /&gt;
&lt;br /&gt;
-Логический корень add-in содержит 2 сборки:Logic.dll and LogicHelper.dll.&lt;br /&gt;
- GUI add-in root содержит только GUI библиотеку. &lt;br /&gt;
&lt;br /&gt;
Есть 2 основные причины включать сборку в add-in root:&lt;br /&gt;
&lt;br /&gt;
-Сборка определяет несколько классов или интерфейсов для применения add-ins.&lt;br /&gt;
-Сборке необходимо загрузить остальные сборки add-in root.&lt;br /&gt;
&lt;br /&gt;
Mono.Addins обеспечивает несколько путей декларирования add-in roots и сборок, связывающих их. Это объясняет деталь описания Add-ins и Add-in Hosts секцию, но в кратце, существуют 3 способа: &lt;br /&gt;
&lt;br /&gt;
- Создание файла  add-in manifest (XML файл с расширением .addin).&lt;br /&gt;
- Создание файла  add-in manifest  и вставка сборок в ресурс.&lt;br /&gt;
-Использование [assembly:AddinRoot] атрибутов для сборок.&lt;br /&gt;
&lt;br /&gt;
В первом и во втором случае, секция Runtime  в manifest может использовать ссылку на сборки, включенных в add-in root.&lt;br /&gt;
Во втором и третьем случае, различные сборки могут ссылаться на используемые атрибуты [assembly:AddinAssemblyInclude].&lt;br /&gt;
&lt;br /&gt;
Add-in roots обычно имеют главный файл. Когда используется одиночный манифест, главным файлом является манифест. Когда же используется манифест включенный в сборку, или использует атрибут [AddinRoot], главный файл сборки. Только главный файл может включать другие файлы в  add-in root.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Add-ins'''&lt;br /&gt;
&lt;br /&gt;
Add-ins во многом схожи с add-in roots, потому что add-in могут так же себя вести как add-in hosts для разных add-ins. Таким образом, add-ins могут содержать несколько сборок и других файлов,и они могут определить использование отдельных манифестов, и встроенных манифестов или применить атрибуты [assembly:Addin] для данных сборок.&lt;br /&gt;
&lt;br /&gt;
Данная диагрмма отображает add-in сборки и определенный другими add-in:&lt;br /&gt;
&lt;br /&gt;
Add-in roots  и add-ins  описывают использование разных Add-in  моделей описания, но они обходятся разными инструментами.&lt;br /&gt;
Add-in root assemblies загружают applications hosts использу &amp;quot;регулярные&amp;quot; сборки, пока add-ins are динамично обнаруженные и  загруженные add-in инструментом.&lt;br /&gt;
&lt;br /&gt;
'''Extensible libraries'''&lt;br /&gt;
Когда add-in root помещается в библиотеку, в результате мы получаем библиотеку расширения. Правильно в этом случае правильно инкапсулировать подход точек расширенпия к библиотеке.&lt;br /&gt;
&lt;br /&gt;
Таким образом, библиотека будет выглядеть как любая другая библиотека,и любое приложение будет иметь возможность использовать ее как любую другую библиотеку.&lt;br /&gt;
&lt;br /&gt;
Mono.Addins поддерживает несколько одинковых копий add-in root в разных местах. Когда загружается add-in root, the add-in engine будет заботитья о загрузке надстройки для данной версии и включит ее в нее..&lt;br /&gt;
&lt;br /&gt;
Например, допустим, кто-то реализующей общую библиотеку для разбора файлы с исходным кодом называется NParser. NParser обеспечит:&lt;br /&gt;
&lt;br /&gt;
- Общий API для разбора файлов.&lt;br /&gt;
- Точка расширения для использования надстроек для добавления поддержки новых языков.&lt;br /&gt;
&lt;br /&gt;
Any application might be able to use NParser by just linking to it and distributing it as a private assembly, or using it from the GAC. In this case, add-ins for the library would be loaded from the global registry, unless the application specified a different add-in registry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Description of Add-ins and Add-in Roots&lt;br /&gt;
&lt;br /&gt;
Every add-in and add-in root has to provide a description of the extensibility elements it provides. There are two ways of doing this:&lt;br /&gt;
&lt;br /&gt;
    * Using custom attributes: Mono.Addins provides several attributes which can be used to mark classes as extensions or extension points. Attributes can also be used to declare add-in information and dependencies.&lt;br /&gt;
    * Using an add-in manifest: a manifest is an XML description of an add-in. Attributes are very easy to use, but not all extensibility features that Mono.Addins provides can be expressed using attributes. Any declaration that can be done using custom attributes can also be done in a manifest, but not everything that can be declared in a manifest can also be expressed using custom attributes. Manifests can be deployed as standalone files, or they can be embedded as a resource in assemblies. Manifest files are identified by their extension, which must be &amp;quot;.addin&amp;quot; or &amp;quot;.addin.xml&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
It is allowed to use a mix of both approaches to describe an add-in. That is, an add-in could declare simple extensions using attributes, and more complex extensions in a manifest embedded as a resource.&lt;br /&gt;
&lt;br /&gt;
As you can see from the previous examples, the description of an add-in root looks similar to the description of an add-in. In fact, from the point of view of the add-in engine, add-ins and add-in roots are almost the same, so they use the same description model.&lt;br /&gt;
&lt;br /&gt;
The following sections describe in detail all information that can be included in an add-in or add-in root description. The term add-in is used generically in this chapter to refer to add-ins and add-in roots, unless specifically differenced.&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1087</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1087"/>
		<updated>2009-12-07T22:00:59Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Атрибут AddinRoot может быть использован для отметки сборки настройки  add-in host. TypeExtensionPoint этот атрибут описывает новую точку расширения с определенным путем для конструктора, и требует узлы типа TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Addin этот атрибут указывает на сборку add-in. Для этого может использоваться идентификатор или версия при необходимости.&lt;br /&gt;
AddinDependency- атрибут описывающий зависимости TextEditor от add-in host.&lt;br /&gt;
Extensio- атрибут указывающий class extension.&lt;br /&gt;
Для этого регистрируем узел расширения с типом TypeExtensionNode с указанием пути.&lt;br /&gt;
&lt;br /&gt;
'''Архитектура приложения расширения.'''&lt;br /&gt;
&lt;br /&gt;
Приложение расширения, состоит как минимум из одной сборки выполнения и одной библиотеки. Mono.Addins основывается на так называемой сильно типизированной модели. Эта модель нуждается в точном объявлени всех точек расширения и иныормации их согласования. Вся эта информация составляет '''add-in root''' (корневой add-in).&lt;br /&gt;
&lt;br /&gt;
'''Add-in roots'''&lt;br /&gt;
&lt;br /&gt;
Приложения расширения доложны объявлять один, как минимум add-in root, но при необходимости могут объявлять и больше.Определив нсколько add-in roots для приложения состоящего из нескольких модулей. Это один из возможных путей, использования инструмента add-ins , основанный на специфике модулей приложения.например мощь инструмента приложении в логике, в одной сборке и GUI в другой. &lt;br /&gt;
&lt;br /&gt;
В порядке разрешения этих типов архитектуры, add-in roots должен иметь уникальный идентификатор.Add-ins  должен ссылаться на этот ID(идентификатор add-in root).Add-in roots  так же имеет номер версии, который используется для поддержания логичности между точками расширения, им используемыми, и расширения представляемых add-ins.&lt;br /&gt;
&lt;br /&gt;
Add-in roots могут связывать одну или несколько сборок, которые могут быть выполняемыми или библиотеками. Сложные приложения состоят обычно из нескольких сборок,поэтому важно тщательно определять, что является add-in root, а что нет.&lt;br /&gt;
&lt;br /&gt;
[картика]&lt;br /&gt;
&lt;br /&gt;
В данном примере приложение состоит из 2-х файлов: консольного и графического приложения.Приложение определяет 2 add-in roots:&lt;br /&gt;
&lt;br /&gt;
-Логический корень add-in содержит 2 сборки:Logic.dll and LogicHelper.dll.&lt;br /&gt;
- GUI add-in root содержит только GUI библиотеку. &lt;br /&gt;
&lt;br /&gt;
Есть 2 основные причины включать сболрку в add-in root:&lt;br /&gt;
&lt;br /&gt;
-Сборка определяет несколько классов или интерфейсов для применения add-ins.&lt;br /&gt;
-Сборке необходимо загрузить остальные сборки add-in root.&lt;br /&gt;
&lt;br /&gt;
Mono.Addins обеспечивает несколько путей декларирования add-in roots и сборок, связывающих их. Это объясняет деталь описания Add-ins и Add-in Hosts секцию, но в кратце, существуют 3 способа: &lt;br /&gt;
&lt;br /&gt;
- Создание файла  add-in manifest (XML файл с расширением .addin).&lt;br /&gt;
- Создание файла  add-in manifest  и вставка сборок в ресурс.&lt;br /&gt;
-Использование [assembly:AddinRoot] атрибутов для сборок.&lt;br /&gt;
&lt;br /&gt;
В первом и во втором случае, секция Runtime  в manifest может использовать ссылку на сборки, включенных в add-in root.&lt;br /&gt;
Во втором и третьем случае, различные сборки могут ссылаться на используемые атрибуты [assembly:AddinAssemblyInclude].&lt;br /&gt;
&lt;br /&gt;
Add-in roots обычно имеют главный файл. Когда используется одиночный манифест, главным файлом является манифест. Когда же используется манифест включенный в сборку, или использует атрибут [AddinRoot], главный файл сборки. Только главный файл может включать другие файлы в  add-in root.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Add-ins'''&lt;br /&gt;
&lt;br /&gt;
Add-ins во многом схожи с add-in roots, потому что add-in могут так же себя вести как add-in hosts для разных add-ins. Таким образом, add-ins могут содержать несколько сборок и других файлов,и они могут определить использование отдельных манифестов, и встроенных манифестов или применить атрибуты [assembly:Addin] для данных сборок.&lt;br /&gt;
&lt;br /&gt;
Данная диагрмма отображает add-in сборки и определенный другими add-in:&lt;br /&gt;
&lt;br /&gt;
Add-in roots  и add-ins  описывают использование разных Add-in  моделей описания, но они обходятся разными инструментами.&lt;br /&gt;
Add-in root assemblies загружают applications hosts использу &amp;quot;регулярные&amp;quot; сборки, пока add-ins are динамично обнаруженные и  загруженные add-in инструментом.&lt;br /&gt;
&lt;br /&gt;
'''Extensible libraries'''&lt;br /&gt;
&lt;br /&gt;
When an add-in root is entirely composed by libraries, what we have in fact is an extensible library. It is important in this case to properly encapsulate the access to extension points in the library. In this way the library will look like any other regular library, and any application will be able to use it like any other library.&lt;br /&gt;
&lt;br /&gt;
Mono.Addins supports having several copies of the same add-in root in different locations. When loading an add-in root, the add-in engine will take care of loading the add-ins that extend that specific add-in root version.&lt;br /&gt;
&lt;br /&gt;
For example, let's say somebody implements a generic library for parsing source code files called NParser. NParser would provide:&lt;br /&gt;
&lt;br /&gt;
    * A common API for parsing files.&lt;br /&gt;
    * An extension point to be used by add-ins to add support for new languages. &lt;br /&gt;
&lt;br /&gt;
Any application might be able to use NParser by just linking to it and distributing it as a private assembly, or using it from the GAC. In this case, add-ins for the library would be loaded from the global registry, unless the application specified a different add-in registry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Description of Add-ins and Add-in Roots&lt;br /&gt;
&lt;br /&gt;
Every add-in and add-in root has to provide a description of the extensibility elements it provides. There are two ways of doing this:&lt;br /&gt;
&lt;br /&gt;
    * Using custom attributes: Mono.Addins provides several attributes which can be used to mark classes as extensions or extension points. Attributes can also be used to declare add-in information and dependencies.&lt;br /&gt;
    * Using an add-in manifest: a manifest is an XML description of an add-in. Attributes are very easy to use, but not all extensibility features that Mono.Addins provides can be expressed using attributes. Any declaration that can be done using custom attributes can also be done in a manifest, but not everything that can be declared in a manifest can also be expressed using custom attributes. Manifests can be deployed as standalone files, or they can be embedded as a resource in assemblies. Manifest files are identified by their extension, which must be &amp;quot;.addin&amp;quot; or &amp;quot;.addin.xml&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
It is allowed to use a mix of both approaches to describe an add-in. That is, an add-in could declare simple extensions using attributes, and more complex extensions in a manifest embedded as a resource.&lt;br /&gt;
&lt;br /&gt;
As you can see from the previous examples, the description of an add-in root looks similar to the description of an add-in. In fact, from the point of view of the add-in engine, add-ins and add-in roots are almost the same, so they use the same description model.&lt;br /&gt;
&lt;br /&gt;
The following sections describe in detail all information that can be included in an add-in or add-in root description. The term add-in is used generically in this chapter to refer to add-ins and add-in roots, unless specifically differenced.&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1086</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1086"/>
		<updated>2009-12-07T21:24:07Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Атрибут AddinRoot может быть использован для отметки сборки настройки  add-in host. TypeExtensionPoint этот атрибут описывает новую точку расширения с определенным путем для конструктора, и требует узлы типа TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Addin этот атрибут указывает на сборку add-in. Для этого может использоваться идентификатор или версия при необходимости.&lt;br /&gt;
AddinDependency- атрибут описывающий зависимости TextEditor от add-in host.&lt;br /&gt;
Extensio- атрибут указывающий class extension.&lt;br /&gt;
Для этого регистрируем узел расширения с типом TypeExtensionNode с указанием пути.&lt;br /&gt;
&lt;br /&gt;
'''Архитектура приложения расширения.'''&lt;br /&gt;
&lt;br /&gt;
Приложение расширения, состоит как минимум из одной сборки выполнения и одной библиотеки. Mono.Addins основывается на так называемой сильно типизированной модели. Эта модель нуждается в точном объявлени всех точек расширения и иныормации их согласования. Вся эта информация составляет '''add-in root''' (корневой add-in).&lt;br /&gt;
&lt;br /&gt;
'''Add-in roots'''&lt;br /&gt;
&lt;br /&gt;
Приложения расширения доложны объявлять один, как минимум add-in root, но при необходимости могут объявлять и больше.Определив нсколько add-in roots для приложения состоящего из нескольких модулей. Это один из возможных путей, использования инструмента add-ins , основанный на специфике модулей приложения.например мощь инструмента приложении в логике, в одной сборке и GUI в другой. &lt;br /&gt;
&lt;br /&gt;
В порядке разрешения этих типов архитектуры, add-in roots должен иметь уникальный идентификатор.Add-ins  должен ссылаться на этот ID(идентификатор add-in root).Add-in roots  так же имеет номер версии, который используется для поддержания логичности между точками расширения, им используемыми, и расширения представляемых add-ins.&lt;br /&gt;
&lt;br /&gt;
Add-in roots могут связывать одну или несколько сборок, которые могут быть выполняемыми или библиотеками. Сложные приложения состоят обычно из нескольких сборок,поэтому важно тщательно определять, что является add-in root, а что нет.&lt;br /&gt;
&lt;br /&gt;
[картика]&lt;br /&gt;
&lt;br /&gt;
В данном примере приложение состоит из 2-х файлов: консольного и графического приложения.Приложение определяет 2 add-in roots:&lt;br /&gt;
&lt;br /&gt;
-Логический корень add-in содержит 2 сборки:Logic.dll and LogicHelper.dll.&lt;br /&gt;
- GUI add-in root содержит только GUI библиотеку. &lt;br /&gt;
&lt;br /&gt;
Есть 2 основные причины включать сболрку в add-in root:&lt;br /&gt;
&lt;br /&gt;
-Сборка определяет несколько классов или интерфейсов для применения add-ins.&lt;br /&gt;
-Сборке необходимо загрузить остальные сборки add-in root.&lt;br /&gt;
&lt;br /&gt;
Mono.Addins обеспечивает несколько путей декларирования add-in roots и сборок, связывающих их. Это объясняет деталь описания Add-ins и Add-in Hosts секцию, но в кратце, существуют 3 способа: &lt;br /&gt;
&lt;br /&gt;
- Создание файла  add-in manifest (XML файл с расширением .addin).&lt;br /&gt;
- Создание файла  add-in manifest  и вставка сборок в ресурс.&lt;br /&gt;
-Использование [assembly:AddinRoot] атрибутов для сборок.&lt;br /&gt;
&lt;br /&gt;
В первом и во втором случае, секция Runtime  в manifest может использовать ссылку на сборки, включенных в add-in root.&lt;br /&gt;
Во втором и третьем случае, различные сборки могут ссылаться на используемые атрибуты [assembly:AddinAssemblyInclude].&lt;br /&gt;
&lt;br /&gt;
Add-in roots обычно имеют главный файл. Когда используется одиночный манифест, главным файлом является манифест. Когда же используется манифест включенный в сборку, или использует атрибут [AddinRoot], главный файл сборки. Только главный файл может включать другие файлы в  add-in root.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Add-ins'''&lt;br /&gt;
&lt;br /&gt;
Add-ins have many similarities to add-in roots, because add-ins can also behave as add-in hosts for other add-ins. So, add-ins can be composed by several assemblies and other files, and they can be described using a standalone manifest, and embedded manifest or by applying the [assembly:Addin] attribute to an assembly.&lt;br /&gt;
&lt;br /&gt;
The following diagram shows an add-in composed by two assemblies, and extended by another add-in:&lt;br /&gt;
&lt;br /&gt;
Add-in roots and add-ins are described using the same Add-in Description Model, but they are handled differently by the add-in engine. Add-in root assemblies are loaded by applications hosts like regular assemblies, while add-ins are dynamically discovered and loaded by the add-in engine.&lt;br /&gt;
Extensible libraries&lt;br /&gt;
&lt;br /&gt;
When an add-in root is entirely composed by libraries, what we have in fact is an extensible library. It is important in this case to properly encapsulate the access to extension points in the library. In this way the library will look like any other regular library, and any application will be able to use it like any other library.&lt;br /&gt;
&lt;br /&gt;
Mono.Addins supports having several copies of the same add-in root in different locations. When loading an add-in root, the add-in engine will take care of loading the add-ins that extend that specific add-in root version.&lt;br /&gt;
&lt;br /&gt;
For example, let's say somebody implements a generic library for parsing source code files called NParser. NParser would provide:&lt;br /&gt;
&lt;br /&gt;
    * A common API for parsing files.&lt;br /&gt;
    * An extension point to be used by add-ins to add support for new languages. &lt;br /&gt;
&lt;br /&gt;
Any application might be able to use NParser by just linking to it and distributing it as a private assembly, or using it from the GAC. In this case, add-ins for the library would be loaded from the global registry, unless the application specified a different add-in registry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Description of Add-ins and Add-in Roots&lt;br /&gt;
&lt;br /&gt;
Every add-in and add-in root has to provide a description of the extensibility elements it provides. There are two ways of doing this:&lt;br /&gt;
&lt;br /&gt;
    * Using custom attributes: Mono.Addins provides several attributes which can be used to mark classes as extensions or extension points. Attributes can also be used to declare add-in information and dependencies.&lt;br /&gt;
    * Using an add-in manifest: a manifest is an XML description of an add-in. Attributes are very easy to use, but not all extensibility features that Mono.Addins provides can be expressed using attributes. Any declaration that can be done using custom attributes can also be done in a manifest, but not everything that can be declared in a manifest can also be expressed using custom attributes. Manifests can be deployed as standalone files, or they can be embedded as a resource in assemblies. Manifest files are identified by their extension, which must be &amp;quot;.addin&amp;quot; or &amp;quot;.addin.xml&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
It is allowed to use a mix of both approaches to describe an add-in. That is, an add-in could declare simple extensions using attributes, and more complex extensions in a manifest embedded as a resource.&lt;br /&gt;
&lt;br /&gt;
As you can see from the previous examples, the description of an add-in root looks similar to the description of an add-in. In fact, from the point of view of the add-in engine, add-ins and add-in roots are almost the same, so they use the same description model.&lt;br /&gt;
&lt;br /&gt;
The following sections describe in detail all information that can be included in an add-in or add-in root description. The term add-in is used generically in this chapter to refer to add-ins and add-in roots, unless specifically differenced.&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1085</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1085"/>
		<updated>2009-12-07T21:16:49Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Атрибут AddinRoot может быть использован для отметки сборки настройки  add-in host. TypeExtensionPoint этот атрибут описывает новую точку расширения с определенным путем для конструктора, и требует узлы типа TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Addin этот атрибут указывает на сборку add-in. Для этого может использоваться идентификатор или версия при необходимости.&lt;br /&gt;
AddinDependency- атрибут описывающий зависимости TextEditor от add-in host.&lt;br /&gt;
Extensio- атрибут указывающий class extension.&lt;br /&gt;
Для этого регистрируем узел расширения с типом TypeExtensionNode с указанием пути.&lt;br /&gt;
&lt;br /&gt;
'''Архитектура приложения расширения.'''&lt;br /&gt;
&lt;br /&gt;
Приложение расширения, состоит как минимум из одной сборки выполнения и одной библиотеки. Mono.Addins основывается на так называемой сильно типизированной модели. Эта модель нуждается в точном объявлени всех точек расширения и иныормации их согласования. Вся эта информация составляет '''add-in root''' (корневой add-in).&lt;br /&gt;
&lt;br /&gt;
'''Add-in roots'''&lt;br /&gt;
&lt;br /&gt;
Приложения расширения доложны объявлять один, как минимум add-in root, но при необходимости могут объявлять и больше.Определив нсколько add-in roots для приложения состоящего из нескольких модулей. Это один из возможных путей, использования инструмента add-ins , основанный на специфике модулей приложения.например мощь инструмента приложении в логике, в одной сборке и GUI в другой. &lt;br /&gt;
&lt;br /&gt;
В порядке разрешения этих типов архитектуры, add-in roots должен иметь уникальный идентификатор.Add-ins  должен ссылаться на этот ID(идентификатор add-in root).Add-in roots  так же имеет номер версии, который используется для поддержания логичности между точками расширения, им используемыми, и расширения представляемых add-ins.&lt;br /&gt;
&lt;br /&gt;
Add-in roots могут связывать одну или несколько сборок, которые могут быть выполняемыми или библиотеками. Сложные приложения состоят обычно из нескольких сборок,поэтому важно тщательно определять, что является add-in root, а что нет.&lt;br /&gt;
&lt;br /&gt;
[картика]&lt;br /&gt;
&lt;br /&gt;
В данном примере приложение состоит из 2-х файлов: консольного и графического приложения.Приложение определяет 2 add-in roots:&lt;br /&gt;
&lt;br /&gt;
-Логический корень add-in содержит 2 сборки:Logic.dll and LogicHelper.dll.&lt;br /&gt;
- GUI add-in root содержит только GUI библиотеку. &lt;br /&gt;
&lt;br /&gt;
Есть 2 основные причины включать сболрку в add-in root:&lt;br /&gt;
&lt;br /&gt;
-Сборка определяет несколько классов или интерфейсов для применения add-ins.&lt;br /&gt;
-Сборке необходимо загрузить остальные сборки add-in root.&lt;br /&gt;
&lt;br /&gt;
Mono.Addins обеспечивает несколько путей декларирования add-in roots и сборок, связывающих их. Это объясняет деталь описания Add-ins и Add-in Hosts секцию, но в кратце, существуют 3 способа: &lt;br /&gt;
&lt;br /&gt;
- Создание файла  add-in manifest (XML файл с расширением .addin).&lt;br /&gt;
- Создание файла  add-in manifest  и вставка сборок в ресурс.&lt;br /&gt;
-Использование [assembly:AddinRoot] атрибутов для сборок.&lt;br /&gt;
&lt;br /&gt;
В первом и во втором случае, секция Runtime  в manifest может использовать ссылку на сборки, включенных в add-in root.&lt;br /&gt;
Во втором и третьем случае, различные сборки могут ссылаться на используемые атрибуты [assembly:AddinAssemblyInclude].&lt;br /&gt;
&lt;br /&gt;
Add-in roots обычно имеют главный файл. Когда используется одиночный манифест, главным файлом является манифест. Когда же используется манифест включенный в сборку, или использует атрибут [AddinRoot], главный файл сборки. Только главный файл может включать другие файлы в  add-in root.&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1084</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1084"/>
		<updated>2009-12-07T20:59:21Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Атрибут AddinRoot может быть использован для отметки сборки настройки  add-in host. TypeExtensionPoint этот атрибут описывает новую точку расширения с определенным путем для конструктора, и требует узлы типа TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Addin этот атрибут указывает на сборку add-in. Для этого может использоваться идентификатор или версия при необходимости.&lt;br /&gt;
AddinDependency- атрибут описывающий зависимости TextEditor от add-in host.&lt;br /&gt;
Extensio- атрибут указывающий class extension.&lt;br /&gt;
Для этого регистрируем узел расширения с типом TypeExtensionNode с указанием пути.&lt;br /&gt;
&lt;br /&gt;
'''Архитектура приложения расширения.'''&lt;br /&gt;
&lt;br /&gt;
Приложение расширения, состоит как минимум из одной сборки выполнения и одной библиотеки. Mono.Addins основывается на так называемой сильно типизированной модели. Эта модель нуждается в точном объявлени всех точек расширения и иныормации их согласования. Вся эта информация составляет '''add-in root''' (корневой add-in).&lt;br /&gt;
&lt;br /&gt;
'''Add-in roots'''&lt;br /&gt;
&lt;br /&gt;
Приложения расширения доложны объявлять один, как минимум add-in root, но при необходимости могут объявлять и больше.Определив нсколько add-in roots для приложения состоящего из нескольких модулей. Это один из возможных путей, использования инструмента add-ins , основанный на специфике модулей приложения.например мощь инструмента приложении в логике, в одной сборке и GUI в другой. &lt;br /&gt;
&lt;br /&gt;
В порядке разрешения этих типов архитектуры, add-in roots должен иметь уникальный идентификатор.Add-ins  должен ссылаться на этот ID(идентификатор add-in root).Add-in roots  так же имеет номер версии, который используется для поддержания логичности между точками расширения, им используемыми, и расширения представляемых add-ins.&lt;br /&gt;
&lt;br /&gt;
Add-in roots могут связывать одну или несколько сборок, которые могут быть выполняемыми или библиотеками. Сложные приложения состоят обычно из нескольких сборок,поэтому важно тщательно определять, что является add-in root, а что нет.&lt;br /&gt;
&lt;br /&gt;
[картика]&lt;br /&gt;
&lt;br /&gt;
В данном примере приложение состоит из 2-х файлов: консольного и графического приложения.Приложение определяет 2 add-in roots:&lt;br /&gt;
&lt;br /&gt;
-Логический корень add-in содержит 2 сборки:Logic.dll and LogicHelper.dll.&lt;br /&gt;
- GUI add-in root содержит только GUI библиотеку. &lt;br /&gt;
&lt;br /&gt;
Есть 2 основные причины включать сболрку в add-in root:&lt;br /&gt;
&lt;br /&gt;
-Сборка определяет несколько классов или интерфейсов для применения add-ins.&lt;br /&gt;
-Сборке необходимо загрузить остальные сборки add-in root.&lt;br /&gt;
&lt;br /&gt;
Mono.Addins обеспечивает несколько путей декларирования add-in roots и сборок, связывающих их. Это объясняет деталь описания Add-ins и Add-in Hosts секцию, но в кратце, существуют 3 способа: &lt;br /&gt;
&lt;br /&gt;
- Создание файла  add-in manifest (XML файл с расширением .addin).&lt;br /&gt;
- Создание файла  add-in manifest  и вставка сборок в ресурс.&lt;br /&gt;
-Использование [assembly:AddinRoot] атрибутов для сборок.&lt;br /&gt;
&lt;br /&gt;
In the first and second case, a Runtime section in the manifest can be used to reference other assemblies to be included in the add-in root. In the second and third case, other assemblies can be referenced using the attribute [assembly:AddinAssemblyInclude].&lt;br /&gt;
&lt;br /&gt;
Add-in roots always have a main file. When using an standalone manifest, the main file is the manifest file. When using a manifest embedded in an assembly, or when using the [AddinRoot] attribute, the main file is the assembly. Only the main file can include other files in the add-in root.&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1083</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1083"/>
		<updated>2009-12-07T20:52:56Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: -&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Атрибут AddinRoot может быть использован для отметки сборки настройки  add-in host. TypeExtensionPoint этот атрибут описывает новую точку расширения с определенным путем для конструктора, и требует узлы типа TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Addin этот атрибут указывает на сборку add-in. Для этого может использоваться идентификатор или версия при необходимости.&lt;br /&gt;
AddinDependency- атрибут описывающий зависимости TextEditor от add-in host.&lt;br /&gt;
Extensio- атрибут указывающий class extension.&lt;br /&gt;
Для этого регистрируем узел расширения с типом TypeExtensionNode с указанием пути.&lt;br /&gt;
&lt;br /&gt;
'''Архитектура приложения расширения.'''&lt;br /&gt;
&lt;br /&gt;
Приложение расширения, состоит как минимум из одной сборки выполнения и одной библиотеки. Mono.Addins основывается на так называемой сильно типизированной модели. Эта модель нуждается в точном объявлени всех точек расширения и иныормации их согласования. Вся эта информация составляет '''add-in root''' (корневой add-in).&lt;br /&gt;
&lt;br /&gt;
'''Add-in roots'''&lt;br /&gt;
&lt;br /&gt;
Приложения расширения доложны объявлять один, как минимум add-in root, но при необходимости могут объявлять и больше.Определив нсколько add-in roots для приложения состоящего из нескольких модулей. Это один из возможных путей, использования инструмента add-ins , основанный на специфике модулей приложения.например мощь инструмента приложении в логике, в одной сборке и GUI в другой. &lt;br /&gt;
&lt;br /&gt;
В порядке разрешения этих типов архитектуры, add-in roots должен иметь уникальный идентификатор.Add-ins  должен ссылаться на этот ID(идентификатор add-in root).Add-in roots  так же имеет номер версии, который используется для поддержания логичности между точками расширения, им используемыми, и расширения представляемых add-ins.&lt;br /&gt;
&lt;br /&gt;
Add-in roots могут связывать одну или несколько сборок, которые могут быть выполняемыми или библиотеками. Сложные приложения состоят обычно из нескольких сборок,поэтому важно тщательно определять, что является add-in root, а что нет.&lt;br /&gt;
&lt;br /&gt;
[картика]&lt;br /&gt;
&lt;br /&gt;
В данном примере приложение состоит из 2-х файлов: консольного и графического приложения.Приложение определяет 2 add-in roots:&lt;br /&gt;
&lt;br /&gt;
-Логический корень add-in содержит 2 сборки:Logic.dll and LogicHelper.dll.&lt;br /&gt;
- GUI add-in root содержит только GUI библиотеку. &lt;br /&gt;
&lt;br /&gt;
Есть 2 основные причины включать сболрку в add-in root:&lt;br /&gt;
&lt;br /&gt;
-Сборка определяет несколько классов или интерфейсов для применения add-ins.&lt;br /&gt;
-Сборке необходимо загрузить остальные сборки add-in root.&lt;br /&gt;
&lt;br /&gt;
Mono.Addins обеспечивает несколько путей декларирования add-in roots и сборок, связывающих их. Это объясняет деталь описания Add-ins и Add-in Hosts секцию, но в кратце, существуют 3 способа: &lt;br /&gt;
&lt;br /&gt;
-&lt;br /&gt;
    * By creating an add-in manifest file (an XML file with a .addin extension).&lt;br /&gt;
    * By creating an add-in manifest file and embedding it in an assembly as a resource.&lt;br /&gt;
    * By applying the [assembly:AddinRoot] attribute to an assembly. &lt;br /&gt;
&lt;br /&gt;
In the first and second case, a Runtime section in the manifest can be used to reference other assemblies to be included in the add-in root. In the second and third case, other assemblies can be referenced using the attribute [assembly:AddinAssemblyInclude].&lt;br /&gt;
&lt;br /&gt;
Add-in roots always have a main file. When using an standalone manifest, the main file is the manifest file. When using a manifest embedded in an assembly, or when using the [AddinRoot] attribute, the main file is the assembly. Only the main file can include other files in the add-in root.&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1082</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1082"/>
		<updated>2009-12-07T20:35:39Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Атрибут AddinRoot может быть использован для отметки сборки настройки  add-in host. TypeExtensionPoint этот атрибут описывает новую точку расширения с определенным путем для конструктора, и требует узлы типа TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Addin этот атрибут указывает на сборку add-in. Для этого может использоваться идентификатор или версия при необходимости.&lt;br /&gt;
AddinDependency- атрибут описывающий зависимости TextEditor от add-in host.&lt;br /&gt;
Extensio- атрибут указывающий class extension.&lt;br /&gt;
Для этого регистрируем узел расширения с типом TypeExtensionNode с указанием пути.&lt;br /&gt;
&lt;br /&gt;
'''Архитектура приложения расширения.'''&lt;br /&gt;
&lt;br /&gt;
Приложение расширения, состоит как минимум из одной сборки выполнения и одной библиотеки. Mono.Addins основывается на так называемой сильно типизированной модели. Эта модель нуждается в точном объявлени всех точек расширения и иныормации их согласования. Вся эта информация составляет '''add-in root''' (корневой add-in).&lt;br /&gt;
&lt;br /&gt;
'''Add-in roots'''&lt;br /&gt;
&lt;br /&gt;
Приложения расширения доложны объявлять один, как минимум add-in root, но при необходимости могут объявлять и больше.Определив нсколько add-in roots для приложения состоящего из нескольких модулей. Это один из возможных путей, использования инструмента add-ins , основанный на специфике модулей приложения.например мощь инструмента приложении в логике, в одной сборке и GUI в другой. &lt;br /&gt;
&lt;br /&gt;
В порядке разрешения этих типов архитектуры, add-in roots должен иметь уникальный идентификатор.Add-ins  должен ссылаться на этот ID(идентификатор add-in root).Add-in roots  так же имеет номер версии, который используется для поддержания логичности между точками расширения, им используемыми, и расширения представляемых add-ins.&lt;br /&gt;
&lt;br /&gt;
Add-in roots могут связывать одну или несколько сборок, которые могут быть выполняемыми или библиотеками. Сложные приложения состоят обычно из нескольких сборок,поэтому важно тщательно определять, что является add-in root, а что нет.&lt;br /&gt;
&lt;br /&gt;
[картика]&lt;br /&gt;
&lt;br /&gt;
В данном примере приложение состоит из 2-х файлов: консольного и графического приложения.Приложение определяет 2 add-in roots:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * The Logic add-in root is composed by two assemblies: Logic.dll and LogicHelper.dll. Since both assemblies are libraries, they can be reused from the console and the gui exes.&lt;br /&gt;
    * The GUI add-in root is composed only by the GUI library. &lt;br /&gt;
&lt;br /&gt;
There are basically two reasons for including an assembly in an add-in root:&lt;br /&gt;
&lt;br /&gt;
    * The assembly defines some classes or interfaces to be implemented by add-ins.&lt;br /&gt;
    * The assembly is required to load other add-in root assemblies. &lt;br /&gt;
&lt;br /&gt;
Mono.Addins provides several ways of declaring add-in roots and the assemblies they are bound to. This is explained in detail in the Description of Add-ins and Add-in Hosts section, but summarizing, there are three ways:&lt;br /&gt;
&lt;br /&gt;
    * By creating an add-in manifest file (an XML file with a .addin extension).&lt;br /&gt;
    * By creating an add-in manifest file and embedding it in an assembly as a resource.&lt;br /&gt;
    * By applying the [assembly:AddinRoot] attribute to an assembly. &lt;br /&gt;
&lt;br /&gt;
In the first and second case, a Runtime section in the manifest can be used to reference other assemblies to be included in the add-in root. In the second and third case, other assemblies can be referenced using the attribute [assembly:AddinAssemblyInclude].&lt;br /&gt;
&lt;br /&gt;
Add-in roots always have a main file. When using an standalone manifest, the main file is the manifest file. When using a manifest embedded in an assembly, or when using the [AddinRoot] attribute, the main file is the assembly. Only the main file can include other files in the add-in root.&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1081</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1081"/>
		<updated>2009-12-07T20:18:48Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Атрибут AddinRoot может быть использован для отметки сборки настройки  add-in host. TypeExtensionPoint этот атрибут описывает новую точку расширения с определенным путем для конструктора, и требует узлы типа TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Addin этот атрибут указывает на сборку add-in. Для этого может использоваться идентификатор или версия при необходимости.&lt;br /&gt;
AddinDependency- атрибут описывающий зависимости TextEditor от add-in host.&lt;br /&gt;
Extensio- атрибут указывающий class extension.&lt;br /&gt;
Для этого регистрируем узел расширения с типом TypeExtensionNode с указанием пути.&lt;br /&gt;
&lt;br /&gt;
'''Архитектура приложения расширения.'''&lt;br /&gt;
&lt;br /&gt;
Приложение расширения, состоит как минимум из одной сборки выполнения и одной библиотеки. Mono.Addins основывается на так называемой сильно типизированной модели. Эта модель нуждается в точном объявлени всех точек расширения и иныормации их согласования. Вся эта информация составляет '''add-in root''' (корневой add-in).&lt;br /&gt;
&lt;br /&gt;
'''Add-in roots'''&lt;br /&gt;
&lt;br /&gt;
Приложения расширения доложны объявлять один, как минимум add-in root, но при необходимости могут объявлять и больше.Определив нсколько add-in roots для приложения состоящего из нескольких модулей. Это один из возможных путей, использования инструмента add-ins , основанный на специфике модулей приложения.например мощь инструмента приложении в логике, в одной сборке и GUI в другой. &lt;br /&gt;
&lt;br /&gt;
В порядке разрешения этих типов архитектуры, add-in roots должен иметь уникальный идентификатор.Add-ins  должен ссылаться на этот ID(идентификатор add-in root).Add-in roots  так же имеет номер версии, который используется для поддержания логичности между точками расширения, им используемыми, и расширения представляемых add-ins.&lt;br /&gt;
&lt;br /&gt;
Add-in roots могут связывать одну или несколько сборок, которые могут быть выполняемыми или библиотеками. Сложные приложения состоят обычно из нескольких сборок,поэтому важно тщательно определять, что является add-in root, а что нет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this example, an application is composed by two executables: a console app and a graphical app. Both executables share the same logic libraries, and the GUI app has a GUI library and a components library. The application defines two add-in roots:&lt;br /&gt;
&lt;br /&gt;
    * The Logic add-in root is composed by two assemblies: Logic.dll and LogicHelper.dll. Since both assemblies are libraries, they can be reused from the console and the gui exes.&lt;br /&gt;
    * The GUI add-in root is composed only by the GUI library. &lt;br /&gt;
&lt;br /&gt;
There are basically two reasons for including an assembly in an add-in root:&lt;br /&gt;
&lt;br /&gt;
    * The assembly defines some classes or interfaces to be implemented by add-ins.&lt;br /&gt;
    * The assembly is required to load other add-in root assemblies. &lt;br /&gt;
&lt;br /&gt;
Mono.Addins provides several ways of declaring add-in roots and the assemblies they are bound to. This is explained in detail in the Description of Add-ins and Add-in Hosts section, but summarizing, there are three ways:&lt;br /&gt;
&lt;br /&gt;
    * By creating an add-in manifest file (an XML file with a .addin extension).&lt;br /&gt;
    * By creating an add-in manifest file and embedding it in an assembly as a resource.&lt;br /&gt;
    * By applying the [assembly:AddinRoot] attribute to an assembly. &lt;br /&gt;
&lt;br /&gt;
In the first and second case, a Runtime section in the manifest can be used to reference other assemblies to be included in the add-in root. In the second and third case, other assemblies can be referenced using the attribute [assembly:AddinAssemblyInclude].&lt;br /&gt;
&lt;br /&gt;
Add-in roots always have a main file. When using an standalone manifest, the main file is the manifest file. When using a manifest embedded in an assembly, or when using the [AddinRoot] attribute, the main file is the assembly. Only the main file can include other files in the add-in root.&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1080</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1080"/>
		<updated>2009-12-07T20:15:01Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Атрибут AddinRoot может быть использован для отметки сборки настройки  add-in host. TypeExtensionPoint этот атрибут описывает новую точку расширения с определенным путем для конструктора, и требует узлы типа TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Addin этот атрибут указывает на сборку add-in. Для этого может использоваться идентификатор или версия при необходимости.&lt;br /&gt;
AddinDependency- атрибут описывающий зависимости TextEditor от add-in host.&lt;br /&gt;
Extensio- атрибут указывающий class extension.&lt;br /&gt;
Для этого регистрируем узел расширения с типом TypeExtensionNode с указанием пути.&lt;br /&gt;
&lt;br /&gt;
'''Архитектура приложения расширения.'''&lt;br /&gt;
&lt;br /&gt;
Приложение расширения, состоит как минимум из одной сборки выполнения и одной библиотеки. Mono.Addins основывается на так называемой сильно типизированной модели. Эта модель нуждается в точном объявлени всех точек расширения и иныормации их согласования. Вся эта информация составляет '''add-in root''' (корневой add-in).&lt;br /&gt;
&lt;br /&gt;
'''Add-in roots'''&lt;br /&gt;
&lt;br /&gt;
Приложения расширения доложны объявлять один, как минимум add-in root, но при необходимости могут объявлять и больше.Определив нсколько add-in roots для приложения состоящего из нескольких модулей. Это один из возможных путей, использования инструмента add-ins , основанный на специфике модулей приложения.например мощь инструмента приложении в логике, в одной сборке и GUI в другой. &lt;br /&gt;
&lt;br /&gt;
В порядке разрешения этих типов архитектуры, add-in roots должен иметь уникальный идентификатор.Add-ins  должен ссылаться на этот ID(идентификатор add-in root).Add-in roots  так же имеет номер версии, который используется для поддержания логичности между точками расширения, им используемыми, и расширения представляемых add-ins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Add-in roots can be bound to one or more assemblies, which can be executables or libraries. Complex applications are usually composed by several assemblies, so it is important to carefully decide what constitutes an add-in root and what not. &lt;br /&gt;
&lt;br /&gt;
In this example, an application is composed by two executables: a console app and a graphical app. Both executables share the same logic libraries, and the GUI app has a GUI library and a components library. The application defines two add-in roots:&lt;br /&gt;
&lt;br /&gt;
    * The Logic add-in root is composed by two assemblies: Logic.dll and LogicHelper.dll. Since both assemblies are libraries, they can be reused from the console and the gui exes.&lt;br /&gt;
    * The GUI add-in root is composed only by the GUI library. &lt;br /&gt;
&lt;br /&gt;
There are basically two reasons for including an assembly in an add-in root:&lt;br /&gt;
&lt;br /&gt;
    * The assembly defines some classes or interfaces to be implemented by add-ins.&lt;br /&gt;
    * The assembly is required to load other add-in root assemblies. &lt;br /&gt;
&lt;br /&gt;
Mono.Addins provides several ways of declaring add-in roots and the assemblies they are bound to. This is explained in detail in the Description of Add-ins and Add-in Hosts section, but summarizing, there are three ways:&lt;br /&gt;
&lt;br /&gt;
    * By creating an add-in manifest file (an XML file with a .addin extension).&lt;br /&gt;
    * By creating an add-in manifest file and embedding it in an assembly as a resource.&lt;br /&gt;
    * By applying the [assembly:AddinRoot] attribute to an assembly. &lt;br /&gt;
&lt;br /&gt;
In the first and second case, a Runtime section in the manifest can be used to reference other assemblies to be included in the add-in root. In the second and third case, other assemblies can be referenced using the attribute [assembly:AddinAssemblyInclude].&lt;br /&gt;
&lt;br /&gt;
Add-in roots always have a main file. When using an standalone manifest, the main file is the manifest file. When using a manifest embedded in an assembly, or when using the [AddinRoot] attribute, the main file is the assembly. Only the main file can include other files in the add-in root.&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1079</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1079"/>
		<updated>2009-12-07T19:54:06Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Атрибут AddinRoot может быть использован для отметки сборки настройки  add-in host. TypeExtensionPoint этот атрибут описывает новую точку расширения с определенным путем для конструктора, и требует узлы типа TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Addin этот атрибут указывает на сборку add-in. Для этого может использоваться идентификатор или версия при необходимости.&lt;br /&gt;
AddinDependency- атрибут описывающий зависимости TextEditor от add-in host.&lt;br /&gt;
Extensio- атрибут указывающий class extension.&lt;br /&gt;
Для этого регистрируем узел расширения с типом TypeExtensionNode с указанием пути.&lt;br /&gt;
&lt;br /&gt;
'''Архитектура приложения расширения.'''&lt;br /&gt;
&lt;br /&gt;
Приложение расширения, состоит как минимум из одной сборки выполнения и одной библиотеки. Mono.Addins основывается на так называемой сильно типизированной модели. Эта модель нуждается в точном объявлени всех точек расширения и иныормации их согласования. Вся эта информация составляет '''add-in root''' (корневой add-in).&lt;br /&gt;
&lt;br /&gt;
'''Add-in roots'''&lt;br /&gt;
&lt;br /&gt;
Приложения расширения доложны объявлять один, как минимум add-in root, но при необходимости могут объявлять и больше.Определив нсколько add-in roots для приложения состоящего из нескольких модулей. Это один из возможных путей, использования инструмента add-ins , основанный на специфике модулей приложения.например мощь инструмента приложении в логике, в одной сборке и GUI в другой. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In order to allow this kind of architectures, add-in roots must have an unique identifier. Add-ins must then specify the add-in root(s) they extend by referencing this ID. Add-in roots also have a version number, which is used to ensure consistency between the extension points they provide, and the extensions provided by add-ins.&lt;br /&gt;
&lt;br /&gt;
Add-in roots can be bound to one or more assemblies, which can be executables or libraries. Complex applications are usually composed by several assemblies, so it is important to carefully decide what constitutes an add-in root and what not. &lt;br /&gt;
&lt;br /&gt;
In this example, an application is composed by two executables: a console app and a graphical app. Both executables share the same logic libraries, and the GUI app has a GUI library and a components library. The application defines two add-in roots:&lt;br /&gt;
&lt;br /&gt;
    * The Logic add-in root is composed by two assemblies: Logic.dll and LogicHelper.dll. Since both assemblies are libraries, they can be reused from the console and the gui exes.&lt;br /&gt;
    * The GUI add-in root is composed only by the GUI library. &lt;br /&gt;
&lt;br /&gt;
There are basically two reasons for including an assembly in an add-in root:&lt;br /&gt;
&lt;br /&gt;
    * The assembly defines some classes or interfaces to be implemented by add-ins.&lt;br /&gt;
    * The assembly is required to load other add-in root assemblies. &lt;br /&gt;
&lt;br /&gt;
Mono.Addins provides several ways of declaring add-in roots and the assemblies they are bound to. This is explained in detail in the Description of Add-ins and Add-in Hosts section, but summarizing, there are three ways:&lt;br /&gt;
&lt;br /&gt;
    * By creating an add-in manifest file (an XML file with a .addin extension).&lt;br /&gt;
    * By creating an add-in manifest file and embedding it in an assembly as a resource.&lt;br /&gt;
    * By applying the [assembly:AddinRoot] attribute to an assembly. &lt;br /&gt;
&lt;br /&gt;
In the first and second case, a Runtime section in the manifest can be used to reference other assemblies to be included in the add-in root. In the second and third case, other assemblies can be referenced using the attribute [assembly:AddinAssemblyInclude].&lt;br /&gt;
&lt;br /&gt;
Add-in roots always have a main file. When using an standalone manifest, the main file is the manifest file. When using a manifest embedded in an assembly, or when using the [AddinRoot] attribute, the main file is the assembly. Only the main file can include other files in the add-in root.&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1078</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1078"/>
		<updated>2009-12-07T19:38:29Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Атрибут AddinRoot может быть использован для отметки сборки настройки  add-in host. TypeExtensionPoint этот атрибут описывает новую точку расширения с определенным путем для конструктора, и требует узлы типа TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Addin этот атрибут указывает на сборку add-in. Для этого может использоваться идентификатор или версия при необходимости.&lt;br /&gt;
AddinDependency- атрибут описывающий зависимости TextEditor от add-in host.&lt;br /&gt;
Extensio- атрибут указывающий class extension.&lt;br /&gt;
Для этого регистрируем узел расширения с типом TypeExtensionNode с указанием пути.&lt;br /&gt;
&lt;br /&gt;
'''Архитектура приложения расширения.'''&lt;br /&gt;
&lt;br /&gt;
Приложение расширения, состоит как минимум из одной сборки выполнения и одной библиотеки. Mono.Addins основывается на так называемой сильно типизированной модели. Эта модель нуждается в точном объявлени всех точек расширения и иныормации их согласования. Вся эта информация составляет '''add-in root''' (корневой add-in).&lt;br /&gt;
&lt;br /&gt;
'''Add-in roots'''&lt;br /&gt;
&lt;br /&gt;
Extensible applications must declare one add-in root, but they can also declare more than one. Defining several add-in roots is useful for applications composed by several modules. In this way it is possible to implement add-ins which target specific modules of the application. For example, an application might implement some logic in one assembly and the GUI in another assembly. In this way it would be possible to build add-ins for extending the logic (with no GUI dependencies), and add-ins for extending the GUI, or add-ins extending both: &lt;br /&gt;
&lt;br /&gt;
n order to allow this kind of architectures, add-in roots must have an unique identifier. Add-ins must then specify the add-in root(s) they extend by referencing this ID. Add-in roots also have a version number, which is used to ensure consistency between the extension points they provide, and the extensions provided by add-ins.&lt;br /&gt;
&lt;br /&gt;
Add-in roots can be bound to one or more assemblies, which can be executables or libraries. Complex applications are usually composed by several assemblies, so it is important to carefully decide what constitutes an add-in root and what not. &lt;br /&gt;
&lt;br /&gt;
In this example, an application is composed by two executables: a console app and a graphical app. Both executables share the same logic libraries, and the GUI app has a GUI library and a components library. The application defines two add-in roots:&lt;br /&gt;
&lt;br /&gt;
    * The Logic add-in root is composed by two assemblies: Logic.dll and LogicHelper.dll. Since both assemblies are libraries, they can be reused from the console and the gui exes.&lt;br /&gt;
    * The GUI add-in root is composed only by the GUI library. &lt;br /&gt;
&lt;br /&gt;
There are basically two reasons for including an assembly in an add-in root:&lt;br /&gt;
&lt;br /&gt;
    * The assembly defines some classes or interfaces to be implemented by add-ins.&lt;br /&gt;
    * The assembly is required to load other add-in root assemblies. &lt;br /&gt;
&lt;br /&gt;
Mono.Addins provides several ways of declaring add-in roots and the assemblies they are bound to. This is explained in detail in the Description of Add-ins and Add-in Hosts section, but summarizing, there are three ways:&lt;br /&gt;
&lt;br /&gt;
    * By creating an add-in manifest file (an XML file with a .addin extension).&lt;br /&gt;
    * By creating an add-in manifest file and embedding it in an assembly as a resource.&lt;br /&gt;
    * By applying the [assembly:AddinRoot] attribute to an assembly. &lt;br /&gt;
&lt;br /&gt;
In the first and second case, a Runtime section in the manifest can be used to reference other assemblies to be included in the add-in root. In the second and third case, other assemblies can be referenced using the attribute [assembly:AddinAssemblyInclude].&lt;br /&gt;
&lt;br /&gt;
Add-in roots always have a main file. When using an standalone manifest, the main file is the manifest file. When using a manifest embedded in an assembly, or when using the [AddinRoot] attribute, the main file is the assembly. Only the main file can include other files in the add-in root.&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1077</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=1077"/>
		<updated>2009-12-07T19:36:26Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Атрибут AddinRoot может быть использован для отметки сборки настройки  add-in host. TypeExtensionPoint этот атрибут описывает новую точку расширения с определенным путем для конструктора, и требует узлы типа TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Addin этот атрибут указывает на сборку add-in. Для этого может использоваться идентификатор или версия при необходимости.&lt;br /&gt;
AddinDependency- атрибут описывающий зависимости TextEditor от add-in host.&lt;br /&gt;
Extensio- атрибут указывающий class extension.&lt;br /&gt;
Для этого регистрируем узел расширения с типом TypeExtensionNode с указанием пути.&lt;br /&gt;
&lt;br /&gt;
'''Архитектура приложения расширения.'''&lt;br /&gt;
&lt;br /&gt;
Приложение расширения, состоит как минимум из одной сборки выполнения и одной библиотеки. Mono.Addins основывается на так называемой сильно типизированной модели. Эта модель нуждается в точном объявлени всех точек расширения и иныормации их согласования. Вся эта информация составляет '''add-in root''' (корневой add-in).&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=972</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=972"/>
		<updated>2009-11-16T10:21:38Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Атрибут AddinRoot может быть использован для отметки сборки настройки  add-in host. TypeExtensionPoint этот атрибут описывает новую точку расширения с определенным путем для конструктора, и требует узлы типа TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Addin этот атрибут указывает на сборку add-in. Для этого может использоваться идентификатор или версия при необходимости.&lt;br /&gt;
AddinDependency- атрибут описывающий зависимости TextEditor от add-in host.&lt;br /&gt;
Extensio- атрибут указывающий class extension.&lt;br /&gt;
Для этого регистрируем узел расширения с типом TypeExtensionNode с указанием пути.&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=971</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=971"/>
		<updated>2009-11-16T10:19:59Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Атрибут AddinRoot может быть использован для отметки сборки настройки  add-in host. TypeExtensionPoint этот атрибут описывает новую точку расширения с определенным путем для конструктора, и требует узлы типа TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Addin этот атрибут указывает на сборку add-in. Для этого может использоваться идентификатор или версия при необходимости.&lt;br /&gt;
AddinDependency- атрибут описывающий зависимости TextEditor от add-in host.&lt;br /&gt;
Extensio- атрибут указывающий class extension.&lt;br /&gt;
Для этого регистрируем узел расширения с типом TypeExtensionNode с указанием пути. &lt;br /&gt;
&lt;br /&gt;
The host application can be the same app shown in the manifest example.&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=970</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=970"/>
		<updated>2009-11-16T10:04:25Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
AddinRoot attribute can be used to mark an assembly as being an add-in host. The TypeExtensionPoint attribute declares a new extension point in path the specified in the constructor, and requiring nodes of type TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
The Addin attribute indicates that an assembly is an add-in. It can also be used to specify the add-in Id and Version if needed. The AddinDependency attribute declares the dependency on the TextEditor add-in host. The Extension attribute marks a class as being an extension. It will register an extension node of type TypeExtensionNode in the provided path. &lt;br /&gt;
&lt;br /&gt;
The host application can be the same app shown in the manifest example.&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=969</id>
		<title>Проект &quot;MonoDevelop Add-in для PascalABC.NET&quot;</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%22MonoDevelop_Add-in_%D0%B4%D0%BB%D1%8F_PascalABC.NET%22&amp;diff=969"/>
		<updated>2009-11-16T10:00:10Z</updated>

		<summary type="html">&lt;p&gt;AlexHit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mono.Addins Reference Manual'''&lt;br /&gt;
&lt;br /&gt;
'''Введение'''&lt;br /&gt;
&lt;br /&gt;
'''Mono.Addins''' является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог &amp;quot;плагинов&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop &amp;quot;плагинов&amp;quot; (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления &amp;quot;плагинов&amp;quot; в системе Eclipse). &lt;br /&gt;
&lt;br /&gt;
Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы. &lt;br /&gt;
&lt;br /&gt;
Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).&lt;br /&gt;
&lt;br /&gt;
'''Основы Mono.Addins'''&lt;br /&gt;
&lt;br /&gt;
Модель расширения Mono.Addins базируется на четырех концепциях:&lt;br /&gt;
&lt;br /&gt;
'''Add-in host:''' приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством  точек расширения(extension points). &lt;br /&gt;
&lt;br /&gt;
'''Extension point:''' пространство, гед add-ins могут регистрировать '''extension nodes'''(узлы расширекния) для расширения функциональности. Extension points определяются путем использования  '''extension paths'''(путей расширения). &lt;br /&gt;
&lt;br /&gt;
'''Extension node:''' Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in:''' Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins. &lt;br /&gt;
&lt;br /&gt;
Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием  XML манифеста(объявления), или с применением атрибутов и типов. &lt;br /&gt;
&lt;br /&gt;
В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.&lt;br /&gt;
&lt;br /&gt;
Для примера рассотрим базовое приложение Mono.Addins. &lt;br /&gt;
&lt;br /&gt;
'''Простейший пример'''&lt;br /&gt;
&lt;br /&gt;
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.&lt;br /&gt;
&lt;br /&gt;
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения. &lt;br /&gt;
&lt;br /&gt;
Приложение текстового редактора состоит из 2-х сборок: &lt;br /&gt;
&lt;br /&gt;
1)TextEditor.exe это само приложение. &lt;br /&gt;
&lt;br /&gt;
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее мы видим базовую структуру. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''public interface ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.&lt;br /&gt;
&lt;br /&gt;
'''Add-in host manifest (TextEditor.addin)'''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; isroot=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditor.exe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;TextEditorLib.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ExtensionPoint path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;ExtensionNode name=&amp;quot;Command&amp;quot; type=&amp;quot;Mono.Addins.TypeExtensionNode&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ExtensionPoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Основной манифест включает следующую информацию: &lt;br /&gt;
&lt;br /&gt;
1)Элемент Addin  объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.&lt;br /&gt;
&lt;br /&gt;
2)Элемент времени выполнения определяет файлы принадлежащие хосту. &lt;br /&gt;
&lt;br /&gt;
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения. &lt;br /&gt;
&lt;br /&gt;
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.&lt;br /&gt;
&lt;br /&gt;
'''The host application (TextEditor.exe)'''&lt;br /&gt;
&lt;br /&gt;
''public class TextEditorApplication&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public static void Main ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		// Initialize the add-in engine&lt;br /&gt;
&lt;br /&gt;
		AddinManager.Initialize ();&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		// Get the extension nodes in the extension point&lt;br /&gt;
&lt;br /&gt;
		foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (&amp;quot;/TextEditor/StartupCommands&amp;quot;)) }&lt;br /&gt;
&lt;br /&gt;
			ICommand command = (ICommand) node.CreateInstance ();&lt;br /&gt;
&lt;br /&gt;
			command.Run ();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого: &lt;br /&gt;
&lt;br /&gt;
1)Инициализировать add-in engine, называемый AddinManager.Initialize() &lt;br /&gt;
&lt;br /&gt;
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов. &lt;br /&gt;
&lt;br /&gt;
3)TypeExtensionNode  это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
''&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
Этот add-in представляет собой простую реализацию интерфейса ICommand.  &lt;br /&gt;
&lt;br /&gt;
'''Add-in manifest (SampleAddin.addin)'''&lt;br /&gt;
''&lt;br /&gt;
&amp;lt;Addin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Import assembly=&amp;quot;SampleAddin.dll&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Runtime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Addin id=&amp;quot;TextEditor&amp;quot; version=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;Extension path = &amp;quot;/TextEditor/StartupCommands&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Command type=&amp;quot;HelloWorldExtension&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/Extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/Addin&amp;gt;''&lt;br /&gt;
Add-in манифест схож с главным манифестом(хоста): &lt;br /&gt;
&lt;br /&gt;
1)Здесь Addin корневой элемент, не предоставляет информацию об идентификационном номере или версии. Ид и версии не требуются  add-ins, если они объявят новые точки расширения они смогут усовершенствовать add-ins. &lt;br /&gt;
&lt;br /&gt;
2)Зависимый элемент определяет зависимость от других add-ins или add-in hosts.&lt;br /&gt;
 &lt;br /&gt;
3)Зависимые элементы могуь использовать описание новых расширений. Свойство определяет точку расширения и расширяется выполнением.&lt;br /&gt;
 &lt;br /&gt;
4)Управляющий элемент расширяет узел. Т.к. узлы этой точки расширения имеют тип TypeExtensionNode, мы должна описывать типы атрибутов для описания имени класса. Этот класс будет создан при вызове CreateInstance данного узла.&lt;br /&gt;
 &lt;br /&gt;
Элемент является продолжением узла. С узлах этой точки расширения имеют тип TypeExtensionNode, удлинители должны предоставить печатать атрибут, который определяет имя класса, представленного этим узлом. Это класс, который будет создан при вызове CreateInstance узла.&lt;br /&gt;
&lt;br /&gt;
'''Простой пример использования атрибутов сборки'''&lt;br /&gt;
&lt;br /&gt;
Данный пример может быть раелизован, использхуя атрибуты сборки вместо xml манифеста. Правда не всеобъявления,которые делаются в манифесте, можно сделать с помощью атрибутов. Но атрибуты активно используются, т.к. они очень удобны, особенно для простых примеров. &lt;br /&gt;
&lt;br /&gt;
'''ICommand library (TextEditorLib.dll)'''&lt;br /&gt;
&lt;br /&gt;
''[assembly:AddinRoot (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[TypeExtensionPoint (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
public interface ICommand&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	string Run ();&lt;br /&gt;
&lt;br /&gt;
}''&lt;br /&gt;
&lt;br /&gt;
AddinRoot attribute can be used to mark an assembly as being an add-in host. The TypeExtensionPoint attribute declares a new extension point in path the specified in the constructor, and requiring nodes of type TypeExtensionNode. &lt;br /&gt;
&lt;br /&gt;
'''An add-in (SampleAddin.dll)'''&lt;br /&gt;
&lt;br /&gt;
[assembly:Addin]&lt;br /&gt;
&lt;br /&gt;
[assembly:AddinDependency (&amp;quot;TextEditor&amp;quot;, &amp;quot;1.0&amp;quot;)]&lt;br /&gt;
 &lt;br /&gt;
[Extension (&amp;quot;/TextEditor/StartupCommands&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
class HelloWorldExtension: ICommand&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public string Run ()&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		Console.WriteLine (&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
The Addin attribute indicates that an assembly is an add-in. It can also be used to specify the add-in Id and Version if needed. The AddinDependency attribute declares the dependency on the TextEditor add-in host. The Extension attribute marks a class as being an extension. It will register an extension node of type TypeExtensionNode in the provided path. &lt;br /&gt;
&lt;br /&gt;
The host application can be the same app shown in the manifest example.&lt;/div&gt;</summary>
		<author><name>AlexHit</name></author>
	</entry>
</feed>