Это то что тебе нужно. Просто переведи код на паскаль.
Там больше объясняется создание бинарника а не сама компиляция. Тому кто только начал с компиляторами - рановато за такое браться.
Купите вот эту книжку и больше ничего не будет нужно:
https://lanbook.com/catalog/informatika/yazyki-programmirovaniya-i-metody-translyatsii/
Если уже занимаетесь саморекламой платного продукта в не предназначенном месте, вы бы хотя бы сказали что то умное. Одна книжка (те более относительно узко направленная) - не может быть исчерпывающей.
Отлично! Книги, напрямую дающие ответ на вопрос, упоминать нельзя. Продолжайте морочить голову задавшему вопрос словами, которые ему ни о чем не говорят. Рекомендуйте книгу дракона и Гриса. Самое то!
Покупать вовсе не обязательно, можно взять, к примеру, отсюда. (отредактировано администратором)
Насчет того, сколько времени надо, чтобы это понять и насколько этим можно будет воспользоваться - другой вопрос.
О! Тут распространяют краденое! Похвально!
Если Вы обо мне, то я не вижу ничего ужасного в публикации ссылки на уже выложенное в Интернет. Закон не возлагает на меня обязанности проверять авторские права, если я не размещаю сам материал или не пользуюсь им в целях извлечения коммерческой выгоды. Правообладатель, если его это тревожит, имеет право потребовать от владельца bookfi.net удалить выложенный материал. Но Вы-то тут каким, простите великодушно, боком?
Но заодно это была “проверка на вшивость”, которую Вы не прошли. Действительно, ситуация похожа на попытку продвинуть платный продукт на некоммерческом ресурсе, каковым является данный сайт, принадлежащий федеральному вузу. Возможно, администрация форума по достоинству оценит Ваши старания.
Зря автора ругаете. Он предлагает купить своё. По доброй воле, без принуждения. Не все книги должны быть бесплатными.
Господа, хватит уже восхвалять халяву!
Вообще, у меня книга Сергея Залмановича, как выяснилось, стоит в первом ряду. Я её использую в спецкурсе по компиляторам.
Текст компилятора большой - 30 страниц кода на Борланд Паскале. Правда там еще и виртуальная машина есть, но - код всё равно большой. И - его как-то трудно набирать с текста книги ))
У меня мечта - написать на PascalABC.NET компактный компилятор (интерпретатор) простого языка - на пару сотен строк.
Можно это попробовать сделать совместными усилиями, а то вопрос это задают достаточно часто.
Без проблем, вот за 4 с небольшим часа собрал заготовку:
Презентационный компилятор.zip (8,3 КБ)
В качестве примера я сделал 2 простеньких парсера выражений (130 и 110 строк, если считать только сам парсящий код) и 1 интерпретатор (поддерживающий присвоение и аж 1 команду), но я сделал всё так - чтоб расширять было очень легко.
Ну и +, конечно, программа для тестирования всего - 0.pas
.
Второй парсер (на обратной польской записи) наверное ещё стоит доработать, добавить там обработчиков ошибок и т.п.
Подробнее про парсеры:
Оба делают одинаковый минимум, умеют обрабатывать операторы +-*/^
, и работают с 2 типами данных - real
и string
.
Более расширяемый синтаксис, к примеру, позволяющий операторы вроде div, как и контекст ошибок - на сколько я понимаю, не влезут в
так что за них я и браться не стал.
Про интерпретатор - я сделал его с полностью таким же синтаксисом как SAC, то есть:
1 строчка=1 команда.
Присвоение это:
*имя_переменной*=*выражение*
Остальные команды:
*имя_команды* *параметр1* *параметр2* *параметр3* ...
Но, команду я сделал только 1, Output
. Добавление ещё 1 команды - это всего пара строк, но я не нашёл что ещё добавить)))
Насчёт организации совместных усилий - наверное стоит создать репозиторий на гитхабе или что то типа того? Ответы на форуме работают, конечно, прекрасно, но только пока не появляется необходимость бросаться большими кусками кода…
О да. А теперь выдели все .pas файлы и нажми по пкм в списке действий Компилировать. Два файла (0.pas (из-за второго) и LineParser_Interpreter1.pas) выдадут ошибку:
[0]Internal compiler error in module Compiler.Compile[0.pas] :'System.Collection
s.Generic.KeyNotFoundException: Данный ключ отсутствует в словаре.
в System.ThrowHelper.ThrowKeyNotFoundException()
в System.Collections.Generic.Dictionary`2.get_Item(TKey key)
в PascalABCCompiler.PCU.PCUWriter.GetUnitToken(common_namespace_node ns)
в PascalABCCompiler.PCU.PCUWriter.GetTypeReference(type_node tn, Byte& is_def
)
в PascalABCCompiler.PCU.PCUWriter.WriteTypeReference(type_node type)
в PascalABCCompiler.PCU.PCUWriter.WriteTypeList(List`1 types)
в PascalABCCompiler.PCU.PCUWriter.WriteTypeReference(type_node type)
в PascalABCCompiler.PCU.PCUWriter.VisitParameter(common_parameter p)
в PascalABCCompiler.PCU.PCUWriter.VisitMethodDefinition(common_method_node me
th, Int32 offset)
в PascalABCCompiler.PCU.PCUWriter.VisitMethodDefinitions(common_type_node ctn
)
в PascalABCCompiler.PCU.PCUWriter.VisitTypeMemberDefinition(common_type_node
ctn)
в PascalABCCompiler.PCU.PCUWriter.SaveSemanticTree(CompilationUnit Unit, Stri
ng TargetFileName, Boolean IncludeDebugInfo)
в PascalABCCompiler.Compiler.SavePCU(CompilationUnit Unit, String TagertFileN
ame)'
Версия 3.4.2.2050. Надо поискать что её вызывает и в issue кинуть.
А где это такое у вас есть? В Проводнике?
У меня проект компилируется - проблем нет
Хах, и правда… Из папки воспроизводится. Ну, ошибка где то в файле на 40 строк, это быстро найти. А пока - компилируйте из IDE, там всё работает, ибо это проблема с .pcu, как #1891.
P.S. #1933.
И репозиторий я таки создал:
Там сразу код с временным фиксом #1933, если кому то очень хочется компилировать из папки))
Прошу воздержаться от каких бы то ни было разборок
Станислав Станиславович, к книжке (в первом издании) прилагался диск, на котором есть аж 5 вариантов компилятора (На Паскале, Си. Яве, Си#, Обероне). Если диска нет, то можно скачать здесь: https://telegra.ph/YAzyki-programmirovaniya-i-metody-translyacii-03-02
P.S. Какие-то странные нравы тут в форуме…
Спасибо!
Да, знаю. Мы с этим боремся. Не всегда успешно правда.