pascalabcnet/documentation/DeveloperGuides/Integrating new language.md
Александр Земляк b23f9c96d0
Деактивация кнопок, связанных с Intellisense, для языков без Intellisense + разделение ILanguageInformation на два интерфейса (#3378)
* Refactor language information classes

* Implement SimpleLanguageInformation abstract class

* Move some properties to SimpleLanguageInformation

* Implement format and debug buttons disabling if Intellisense is not supported for current language

* Add Intellisense available check in FormsExtensions to deactivate menu items if needed

* Change function interfaces in VisibilityService

* Replace CodeCompletionController.CurrentParser null checks with IntellisenseAvailable method call

* Refactor IParser and BaseParser to deduplicate code

* Fix BuildTreeInSpecialMode in SPythonParser

* Add SimpleParser class for new languages without Intellisense

* Delete duplicate SetDebugButtonsEnabled function

* Add Intellisense available check in RunService when attaching debugger

* Delete inner check in SetDebugButtonsEnabled to improve architecture

* Change CurrentParser property in CodeCompletion to be CurrentLanguage

* Divide ILanguageInformation into two interfaces (creating new ILanguageIntellisenseSupport)

* Fix LanguageIntellisenseSupport initialization in BaseLanguage

* Fix RunService fictive_attach logic

* Disable Intellisense parsing for languages without Intellisense support

* Add DefaultLanguageInformation abstract class

* Add default implementation for SetSemanticConstants in BaseLanguage

* Simplify IParser interface

* Update developer guide documentation
2026-01-27 22:25:28 +03:00

6.7 KiB
Raw Blame History

Шаг 1

Необходимо создать папку, называющуюся так же, как Ваш язык в папке AdditionalLanguages, расположенной в корне репозитория. Далее создать в ней два обязательных проекта. Это проект парсера Вашего языка, а также проект, содержащий класс Вашего языка (унаследованный от класса BaseLanguage, находящегося в стандартном проекте LanguageIntegrator) и класс "базы данных" языка (унаследованный от класса DefaultLanguageInformation или напрямую от интерфейса ILanguageInformation из проекта ParserTools).

Для совместимости целевой платформой Ваших проектов должна быть .NET Framework 4.0. В свойствах проекта и для Release, и для Debug версии должен быть выбран выходной путь ..\..\..\bin\.

[!NOTE] Соглашение об именовании Чтобы платформа PascalABC.NET смогла подключить библиотеку с Вашим языком нужно, чтобы имя Вашей основной сборки (содержащей наследника BaseLanguage) заканчивалось на "LanguageInfo" (то есть имело вид *LanguageInfo.dll). Имя наследника BaseLanguage должно иметь постфикс "Language".

Шаг 2

В проекты Вы добавляете все необходимые для работы ссылки. Вам точно понадобятся ссылки на проекты ParserTools, Errors, SyntaxTree в проекте Вашего парсера и на проекты LanguageIntegrator, ParserTools, SyntaxTree в проекте с наследником BaseLanguage.

Шаг 3

Вам нужно унаследовать Ваш парсер (который является оберткой над GPPG парсером) от класса BaseParser, либо от класса SimpleParser, если Вы не хотите на начальном этапе реализовывать методы парсера для поддержки Intellisense.

Класс BaseParser содержит абстрактные методы, обязательные к реализации, самый главный из которых называется BuildTreeInNormalMode. Он отвечает за построение синтаксического дерева программы при обычном процессе компиляции. Остальные методы в основном относятся к Intellisense.

Для реализации BuildTreeInNormalMode Вам потребуется вызвать в этом методе сгенерированный GPPG парсер Вашего языка. Возвращаемое значение должно быть корнем полученного в результате парсинга синтаксического дерева.

Для реализации парсера Вы можете также использовать такие базовые абстрактные классы как BaseKeywords и BaseParserTools.

Шаг 4

Для реализации свойств в наследнике DefaultLanguageInformation Вам нужно задать следующие параметры языка:

  1. имя языка, версия языка, строка с указанием авторских прав
  2. расширения файлов Вашего языка
  3. имена стандартных модулей языка
  4. чувствительность к регистру и т. д. Обращайте внимание на документирующие комментарии к свойствам.

Шаг 5

В сделанном Вами наследнике BaseLanguage Вы пишете конструктор, который передает в base() следующие параметры:

  1. класс "базы данных" языка, хранящий информацию в основном необходимую для Intellisense (наследник DefaultLanguageInformation).
  2. класс с методами для поддержки Intellisense (если его нет, можно передавать null)
  3. парсер Вашего языка (наследник BaseParser)
  4. парсер XML-комментариев (если его нет, то можно передавать null)
  5. список преобразователей синтаксического дерева с одним обязательным элементом (для него можно взять стандартную базовую версию под названием DefaultSyntaxTreeConverter)

При необходимости Вы можете переопределить метод SetSemanticConstants, в котором нужно задавать необходимые параметры (значения переменных) из файла SemanticRulesConstants.cs (проект TreeConverter). Для простого языка этого может не потребоваться.

И наконец, реализуете метод SetSyntaxTreeToSemanticTreeConverter, в котором создаете новый экземпляр преобразователя синтаксического дерева в семантическое (присваиваете его свойству SyntaxTreeToSemanticTreeConverter). Для простых языков в качестве преобразователя можно присваивать экземпляр класса syntax_tree_visitor, получив его следующим образом: LanguageProvider.Instance.MainLanguage.SyntaxTreeToSemanticTreeConverter.


Если описанные выше шаги проделаны правильно, то при запуске оболочки в окне сообщений компилятора Вы увидите информацию о Вашем языке в списке подключенных. Если же в этом окне будет выводиться ошибка, связанная с подключением сборки Вашего языка, то обратитесь к файлу log.txt в папке bin (запись в лог ведется только в режиме Debug).