Проверка типов

Добавим в наш язык арифметических выражений типы:

  • int для целых чисел
  • float для дробных
  • Тип функций, учитывающий количество и типы аргументов

Для начала ограничимся явно типизированным подходом: типы аргументов функций определяются явно, типы литералов определяются формой литералов (например 1 интерпретируется как int, а 1.0 – как float), типы выражений выводятся методом синтеза типов. Также разрешим неявное преобразование int к float (но не наоборот!)

Упражнение 1

Добавьте синтаксические формы в грамматику языка, позволяющие указание типов. Предлагается использовать символ : после имени аргумента для указания типа, напр. sum(x:int, y:int) = x+y. Тип результата функции определяется типом выражения в правой части.

Упражнение 2

Опишите операционную семантику системы типов. Операционная семантика вывода типов рассмотрена в лекции 2 курса “функциональное и логическое программирование”.

Упражнение 3

Реализуйте проверку типов на основе определённой в упражнении 2 операционной семантики.

Упражнение 4 (**)

Добавьте вывод типов аргументов функции в месте вызова на основе алгоритма унификации.