Свой разборщик аналога упрощённого Delphi
От: uni Россия  
Дата: 05.08.19 06:06
Оценка:
Доброго. Я недавно узнал про Nemerle (посмотрел старый доклад 2011 г Дениса Рысцова) и хотел бы уточнить по поводу возможностей технологии.
Задача такая. Существует семейство языков МЭК для промышленного программирования. Есть стандарт, являющийся "калькой" буржуйского — ГОСТ Р МЭК 61131-3-2016 (введён в действие: 01.04.2017).
В общем, там есть несколько языков. Часть из них как-бы графическая, часть текстовая. Меня интересует Delphi-подобный язык ST, который в этом новом стандарте стал поддерживать некоторые свойства ООП.
Так вот, я хотел бы иметь парсер этого языка ST с тем намерением, чтобы транслировать его выражения в другой язык (C#,C++,...).

Приведу пример. Так выглядит простая программа на ST (пусть без ООП):
PROGRAM program0
  VAR
    bFirstCycle : BOOL := true;
    t1 : TON;
  END_VAR
  VAR
    out0 AT %QX0.0 : BOOL;
    in0 AT %IX0.0 : BOOL;
  END_VAR

  if bFirstCycle then

    bFirstCycle := false;
    
  end_if;

  t1( in := not t1.q, pt := t#1s );

  if t1.q then out0 := not out0; end_if;
END_PROGRAM


CONFIGURATION config

  RESOURCE resource1 ON PLC
    TASK task0(INTERVAL := T#0.2ms,PRIORITY := 0);
    PROGRAM instance0 WITH task0 : program0;
  END_RESOURCE
END_CONFIGURATION


Я хочу транслировать блоки: PROGRAM — END_PROGRAM, VAR — END_VAR и прочие подобные в альтернативные конструкции на другом языке, чтобы потом собрать получившийся код доступным компилятором для целевой платформы. Эта технология называется SoftPLC, т.е. таким образом мы получаем программный промышленный контроллер.

Добавлю, что существует утилита с традиционным подходом, решающая эту задачу: matiec. Только там C-код на выходе. Существует также готовая полурабочая IDE Beremiz, которая делает подобное совместно с matiec. Меня не устраивает эта связка (как-то убого). Примеры, которые я увидел в докладе Дениса Рысцова, мне понравились. Они гораздо проще. Я хотел пойти обычным путём грамматик и изучения matiec компилятора, но это, видимо, гораздо сложнее, чем разбор, который я видел на примере Nemerle.Peg.

Вопрос: Есть ли какой-нибудь учебник или примеры, на которых я мог бы потренироваться? Откуда брать информацию по практическому применению? Может быть уже кто-то разбирал Delphi или Pascal и можно посмотреть как это сделано? Правильно ли я вообще понимаю возможности инструмента? Т.е. можно ли на его основе сделать транслятор на другой язык? Например: ООП Паскаль в C++. При разумных ограничениях.

В идеале мне хотелось бы разобрать все МЭК языки и добавить кое-чего своего.
Отредактировано 05.08.2019 6:18 uni . Предыдущая версия .
Re: Свой разборщик аналога упрощённого Delphi
От: LuciferSaratov Россия  
Дата: 05.08.19 07:59
Оценка: +1
Здравствуйте, uni, Вы писали:

uni>Вопрос: Есть ли какой-нибудь учебник или примеры, на которых я мог бы потренироваться? Откуда брать информацию по практическому применению? Может быть уже кто-то разбирал Delphi или Pascal и можно посмотреть как это сделано?


я, к сожалению, по немерле не специалист.
аналогичную задачу я решал при помощи ANTLR, нужна была трансляция из специализированного скрипта в C#.
этот инструмент популярный, в свободном доступе можно найти уже готовые грамматики паскаля.
Re: Свой разборщик аналога упрощённого Delphi
От: catbert  
Дата: 05.08.19 08:04
Оценка:
Есть туториал: https://github.com/rsdn/nemerle/wiki/PegGrammar

Не припомню чтобы кто-нибудь использовал Nemerle.PEG для паскалевидных языков. Но грамматика Паскаля отлично парсится любым способом, с помощью PEG тоже должно быть не супер сложно.
На основе инструмента можно сделать транслятор на другой язык. Обычно делают так: создается синтактическое дерево программы (AST), потом его обходят для анализа, или поиска ошибок, или генерации исходников на другом языке.

Здравствуйте, uni, Вы писали:

uni>Вопрос: Есть ли какой-нибудь учебник или примеры, на которых я мог бы потренироваться? Откуда брать информацию по практическому применению? Может быть уже кто-то разбирал Delphi или Pascal и можно посмотреть как это сделано? Правильно ли я вообще понимаю возможности инструмента? Т.е. можно ли на его основе сделать транслятор на другой язык? Например: ООП Паскаль в C++. При разумных ограничениях.


uni>В идеале мне хотелось бы разобрать все МЭК языки и добавить кое-чего своего.
http://nemerle.org/banners/?t=%20catbert%20
Re[2]: Свой разборщик аналога упрощённого Delphi
От: uni Россия  
Дата: 05.08.19 09:25
Оценка:
C>Есть туториал: https://github.com/rsdn/nemerle/wiki/PegGrammar

C>Не припомню чтобы кто-нибудь использовал Nemerle.PEG для паскалевидных языков. Но грамматика Паскаля отлично парсится любым способом, с помощью PEG тоже должно быть не супер сложно.

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

Отлично. Придётся восполнить моё 10 летнее отставание по теме. Дело в том, что там не совсем обычный Паскаль, но достаточно близок к нему. Промышленность живёт в параллельной реальности, которая напоминает прошлое лет 15-20 назад. Это и хорошо, и плохо. Мне приходилось работать в двух мирах программистом. Современные "удобства", когда некоторую часть "грязной" работы за тебя делает язык или среда разработки, там недоступны пока.

Поскольку c# мне больше знаком, то иметь возможность делать что-то нетривиальное с его помощью очень хочется. Я хотел бы создать среду разработки для этих вот языков, добавив правила для возможности разработки интерфейса пользователя, как это сделано в WPF. Изначально язык ST не был ориентирован на графические задачи. И сейчас это тоже так. Хочется расширить возможности, имея связь между векторной графикой и программой, чего нет в существующем стандарте. Поскольку я также и разработчик встраиваемых систем, то мне хочется иметь инструмент, который позволяет упростить разработку кода для некоторого железа (малой автоматики). По аналогии как это сделано в Arduino Framework'е. Только авторы его делали всё по-старинке, "эмулируя" С-подобный скриптовый язык при помощи шаблонов C++. Что выглядит как костыль, но этим пользуются миллионы ардуинщиков на планете. Это, кстати, тоже интересная задачка — придумать язык для Arduino. Тоже в виде транслятора можно, т.к. avr-gcc для платформы существует. Можно пойти дальше и сделать то же для ARM'а, т.к. там писать программы гораздо сложнее.

Думается в этом основной смысл всей этой затеи, насколько я это понял, — дать возможность простым смертным программистам создавать компиляторы компиляторов. Пойду искать/читать статьи за последние 10 лет по теме.
Re[2]: Свой разборщик аналога упрощённого Delphi
От: uni Россия  
Дата: 05.08.19 09:41
Оценка:
LS>аналогичную задачу я решал при помощи ANTLR, нужна была трансляция из специализированного скрипта в C#.
LS>этот инструмент популярный, в свободном доступе можно найти уже готовые грамматики паскаля.

Да, изначально я наткнулся на статью на хабре про ANTLR, где в комментариях упоминали Nemerle.PEG. Вот и прошёлся по ссылочкам. Оказалось, что RSDN ещё живой. Меня подкупила простота примеров, которые были показаны в демке 2011 г. Я как-то переделывал потоковый парсер JSON'а как раз на язык ST, пришлось изучать как устроен парсер, называющийся jsmn. Я вручную перелопачивал код парсера, а можно написать там 40 строк и получить искомое дерево. Конечно хочется владеть хотя бы каким-то инструментом, который может делать подобные вещи таким образом.
Re[3]: Свой разборщик аналога упрощённого Delphi
От: okon  
Дата: 16.09.19 11:23
Оценка:
uni>Поскольку c# мне больше знаком, то иметь возможность делать что-то нетривиальное с его помощью очень хочется. Я хотел бы создать среду разработки для этих вот языков, добавив правила для возможности разработки интерфейса пользователя, как это сделано в WPF.

Интересно откуда появился этот страшнный "Pascal" из какой предметной области ? Почему там без него никак ?
если вам кажется что я зарегистрировался ради именно этого поста то вам надо обратиться сюда http://podskazki.info/mnitelnost/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.