/harser

Parser for imperative language

Primary LanguageHaskellBSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

Pretty-printer|interpreter для языка C++

Table of contents

В этом задании вам предлагается реализовать интерпретатор и prerry-printer для подмножества вашего любимого языка программирования. В качестве любимого языка программирования можно выбрать любой разумный императивный язык (C, Python, Go, Pascal). Также вы можете реализовать задания для языка Prolog.

Для этого вам нужно реализовать следующее:

  • Необходимо поддержать конструкции для работы с переменными (присваивание, чтение с клавиатуры, печать на стандартный вывод).
  • Типы данных: числа целые и с плавающей точкой, строки и булы.
  • Конструкции условных переходов и циклов (хотя бы один из циклов for, while, until на выбор).
  • Функции, которые принимают от 0 до 2 аргументов и возвращают в качестве результата одно значение, например:
    def max(a, b):
        return a > b
    
  • Парсер для грамматики языка, который будет переводить текст программы в хаскельный eDSL.
  • Для написания парсера можно (и даже рекомендуется) использовать парсер библиотеки, например megaparsec, а также библиотеки с парсер-генераторами, например happy.
  • Интерпретатор, который будет интерпретировать хаскельный eDSL.
  • Принтер, который будет красиво печатать хаскельный eDSL.
  • Исполняемый файл, который можно вызвать для интерпретации или pretty-printing’а программы из текстового файла, в котором содержится код на выбранном вами языке программирования.

При выполнении задания обратите внимание на обработку ошибок, интерпретатор должен падать с человекочитаемыми ошибками. При выполнении настоятельно рекомендуется использовать free-monad'ы или tagless final.

Build the project

stack build

Start

stack ghci
:main -h

Run the tests

stack test

final tagless
final tagless video
precedence