Обсуждение статьи "Синтаксический анализ MQL средствами MQL"

 

Опубликована статья Синтаксический анализ MQL средствами MQL:

Статья описывает препроцессор, сканер и парсер для синтаксического анализа исходных кодов на MQL. Реализация на MQL прилагается.

Суть программирования заключается в формализации и автоматизации неких процессов с помощью языков общего или специального назначения. Торговая платформа MetaTrader позволяет применять программирование для решения самых разных задач трейдера, благодаря встроенному языку MQL. И обычно процесс программирования строится на анализе и обработке прикладных данных по правилам, изложенным в исходных кодах. Однако иногда возникает необходимость проводить анализ и обработку самих исходных кодов. Вот несколько примеров.

Одна из наиболее понятных и востребованных задач — контекстно-смысловой поиск по базе исходных кодов. Разумеется, в исходном коде можно искать строки как в обычном тексте, но при этом теряется семантика искомого. А ведь в случае исходных кодов желательно различать специфику применения подстроки в каждом конкретном случае. Если программист хочет найти, где используется конкретная переменная, например, "notification", то простой поиск по её названию может выдать много лишнего, если строка встречается в других значениях — как имя метода, литерал или в комментариях.

Более сложной и востребованной, как правило, на крупных проектах, является задача по выявлению структуры кода, зависимостей, иерархии классов. Она тесно связана с мета-программированием, которое позволяет проводить рефакторинг кода (улучшение) и кодогенерацию. Напомним, что редактор MetaEditor предоставляет некоторые возможности кодогенерации, в частности, создание исходных кодов экспертов с помощью Мастера или формирование заголовочного файла по исходному коду. Однако потенциальные возможности данной технологии гораздо шире.

Анализ структуры кода позволяет вычислять различные метрики его качества, статистику, а также находить типичные источники runtime-ошибок, которые не может выявить компилятор. На самом деле, компилятор, конечно, сам является первым инструментом анализа исходного кода, и выдает много типов предупреждений, однако проверка на все потенциальные ошибки в него, как правило, не встраивается — это слишком объемная задача, и потому её поручают отдельным программам.

Кроме того, синтаксический анализ исходных кодов используется для стилизации (форматирования) и обфускации (запутывания).

UML-диаграмма классов синтаксического анализа MQL

Автор: Stanislav Korotky

 
Тема сложная и интересная, но каким может быть практическое применение? Создание редактора? ИИ?
 

Статья написана очень хорошо, качественно. Логично предположить, что продолжением лексического парсинга, является "смысловой" парсинг, о котором и предлагаю написать следующую статью. А после смыслового парсинга, нам будет рукой подать до создания ИИ. :)

ЗЫ. Только искуственную психику с базовыми интеллектуальными функциями останется дописать.

 

Серьезный вопрос к автору:

У меня имеется свой язык разметки. Он имеет набор правил и состоит из ключевых слов, которые являются числами.

БОльшая часть ключевых слов чередуется со строковыми словами - названиями групп или элементов, и эти строковые "лексемы" анализировать нет необходимости. Допуск ошибок в названии ключевых слов ловит компилятор MQL, потому что их дефайны подключены в файле.

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

Можно ли это сделать, опираясь на изложенную в статье концепцию парсинга, или требуется создать иной механизм?

Полагаюсь на Ваш опыт.

Спасибо.

 
Реter Konow:

...

Можно ли это сделать, опираясь на изложенную в статье концепцию парсинга, или требуется создать иной механизм?

...

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

Лексический, грамматический и синтаксический разбор гораздо сложнее, так как человеческие слова не имеют числового эквивалента, в отличии от комманд. Слова обладают свойствами, которые не имеют числа, и этих свойств очень много. Лексический парсинг требует работы с разными свойствами не только слов, но и фраз или пунктуации. А над всем этим "парит" смысл вложенный в текст (контекст), извлечение которого может стать задачей смыслового парсинга в будущем (не уверен, что он существует).

Для моих задач, достаточно простого контроля последовательности комманд. 

 
Со временем попробуем какой-либо известный статический анализатор прикрутить.

Сами пользуемся PVS Studio
 

Наверное, с помощью данного метода возможно написание конвертера mq4->mq5 для Маркета:

  • запускается ex5-советник, которому скармливается mq4-код.
  • На выходе mq5-код.
Подобные попытки в Маркете имеются, но слабоватые.

 

Выкладываю обновленные исходники.

Обеспечена компилируемость в последних билдах.

Исправлено несколько трудноуловимых ошибок.

Файлы:
 
Stanislav Korotky:

Выкладываю обновленные исходники.

Заменил в статье
 
Круто. Пример рефакторинга ещё бы.
Причина обращения: