Написать свой ЯП на Pascal

Доброго времени! Возможно ли написать свой ЯП на паскале, хотя бы для выполнения арифметических операций? Подскажите, пожалуйста, с чего начать копать)

С теории вопроса, конечно. Начните с описания синтаксиса своего языка, к примеру в БНФ. Изучите принципы парсинга и выберите/напишите подходящий парсер. А там видно будет…

1 лайк

А синтаксис должен быть обязательно совсем новый или можно заимствовать стандартные клавиатурные математические символы? И поясните, пожалуйста, что такое НФБ.

Синтаксис это то как выглядят операторы присвоения, вызовы подпрограмм и т.п. Вот, например, Hello world на разных языках:
https://pikabu.ru/story/hello_world_na_raznyikh_yazyikakh_1871649

Посмотрите в самом начале, Pawn и Python - выглядит похоже, но в питоне подпрограмма print вызывается без скобочек. Вот с такими мелочами надо определится.

А синтаксис арифметических выражений - он в основном одинаковый во всех языках. Основные операции обычно описывают как +,-,*,/, не зависимо от языка, так уж все привыкли.

Далее - вам доступна побайтовая запись в файл (System.IO.BinaryWriter) и оператор if. Этого уже вполне достаточно, чтоб зная как правильно сохранить машинный код - написать абслютно любую программу.

Это, конечно, не очень практично. Но это значит что ваше “а мне разрешается так сделать?” вас будет тормозить. Потому что можно всё, на что хватит фантазии.

Что касается более практичного на начальном уровне - начните с интерпретатора, без выражений, просто чтоб понять азы. То есть 1 строчка текстового файла=1 команда, и после прочтения каждой 1 строчки - её сразу будет выполнять. А далее и к выражениям (лучше, сначала, только арифметическим, и отдельно от языка).

Но опять же, вам ни в коем случае не надо делать именно так как сказали. Я сам с парсеров начал, и ничего, живой, и свой язык уже успел написать. Правда, мой первый парсер даже про приоритет операций не знал, то есть 2+2*2 у него было 8)).

1 лайк

Это в спешке перепутанные буквы)) БНФ - форма Бэкуса - Наура для представления грамматики. Удобна, если парсер позволяет использовать рекурсию. Не найдете парсер - придется читать про Конечные Автоматы…

1 лайк

Никогда ничего подобного не делал, поэтому буксую. Почитал разные статьи, читаю книгу дракона, но, все равно не пойму с чего начать. Мое тех задание: написать ЯП, желательно на паскале, чтобы он выполнял 4 главные математические операции(±*/), имел оператор ввода и вывода, мог выводить текстовые константы в программе типа “Введите 2 числа”. Может быть и условный оператор удастся реализовать. Подскажите, пожалуйста, на какие мелкие шаги разбить эту задачу. Может подскажите, что почитать, из более конкретного, чтобы не захлебнуться в теории.

Напишите отдельно интерпретатор и отдельно парсер для выражений. Доведите их до нужного вам уровня, в идеале через несколько поколений (то есть переписывая, научившись на предыдущей попытке). А потом уже соединяйте.

1 лайк

Свой первый компилятор я писал, имея “в арсенале” только одну книгу:

Грис Д. Конструирование компиляторов для цифровых вычислительных машин

1 лайк

Это то что тебе нужно. Просто переведи код на паскаль.

Там больше объясняется создание бинарника а не сама компиляция. Тому кто только начал с компиляторами - рановато за такое браться.

Купите вот эту книжку и больше ничего не будет нужно:

https://lanbook.com/catalog/informatika/yazyki-programmirovaniya-i-metody-translyatsii/

Если уже занимаетесь саморекламой платного продукта в не предназначенном месте, вы бы хотя бы сказали что то умное. Одна книжка (те более относительно узко направленная) - не может быть исчерпывающей.

Отлично! Книги, напрямую дающие ответ на вопрос, упоминать нельзя. Продолжайте морочить голову задавшему вопрос словами, которые ему ни о чем не говорят. Рекомендуйте книгу дракона и Гриса. Самое то!

1 лайк

Покупать вовсе не обязательно, можно взять, к примеру, отсюда. (отредактировано администратором)

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

1 лайк

О! Тут распространяют краденое! Похвально!

Если Вы обо мне, то я не вижу ничего ужасного в публикации ссылки на уже выложенное в Интернет. Закон не возлагает на меня обязанности проверять авторские права, если я не размещаю сам материал или не пользуюсь им в целях извлечения коммерческой выгоды. Правообладатель, если его это тревожит, имеет право потребовать от владельца bookfi.net удалить выложенный материал. Но Вы-то тут каким, простите великодушно, боком?

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

1 лайк

Как каким, посмотрите на инициалы автора книги и на ник @c3c)))

Зря автора ругаете. Он предлагает купить своё. По доброй воле, без принуждения. Не все книги должны быть бесплатными.

Господа, хватит уже восхвалять халяву!

Вообще, у меня книга Сергея Залмановича, как выяснилось, стоит в первом ряду. Я её использую в спецкурсе по компиляторам.

Текст компилятора большой - 30 страниц кода на Борланд Паскале. Правда там еще и виртуальная машина есть, но - код всё равно большой. И - его как-то трудно набирать с текста книги ))

У меня мечта - написать на PascalABC.NET компактный компилятор (интерпретатор) простого языка - на пару сотен строк.

Можно это попробовать сделать совместными усилиями, а то вопрос это задают достаточно часто.

2 лайка

Без проблем, вот за 4 с небольшим часа собрал заготовку:
Презентационный компилятор.zip (8,3 КБ)

В качестве примера я сделал 2 простеньких парсера выражений (130 и 110 строк, если считать только сам парсящий код) и 1 интерпретатор (поддерживающий присвоение и аж 1 команду), но я сделал всё так - чтоб расширять было очень легко.
Ну и +, конечно, программа для тестирования всего - 0.pas.

Второй парсер (на обратной польской записи) наверное ещё стоит доработать, добавить там обработчиков ошибок и т.п.


Подробнее про парсеры:

Оба делают одинаковый минимум, умеют обрабатывать операторы +-*/^, и работают с 2 типами данных - real и string.

Более расширяемый синтаксис, к примеру, позволяющий операторы вроде div, как и контекст ошибок - на сколько я понимаю, не влезут в

так что за них я и браться не стал.


Про интерпретатор - я сделал его с полностью таким же синтаксисом как SAC, то есть:

1 строчка=1 команда.

Присвоение это:

*имя_переменной*=*выражение*

Остальные команды:

*имя_команды* *параметр1* *параметр2* *параметр3* ...


Но, команду я сделал только 1, Output. Добавление ещё 1 команды - это всего пара строк, но я не нашёл что ещё добавить)))


Насчёт организации совместных усилий - наверное стоит создать репозиторий на гитхабе или что то типа того? Ответы на форуме работают, конечно, прекрасно, но только пока не появляется необходимость бросаться большими кусками кода…

1 лайк