Skip to content

Instantly share code, notes, and snippets.

@sergey-shambir
Created April 19, 2016 17:01
Show Gist options
  • Save sergey-shambir/27dbf7e5d651946d5942c633675e0a6f to your computer and use it in GitHub Desktop.
Save sergey-shambir/27dbf7e5d651946d5942c633675e0a6f to your computer and use it in GitHub Desktop.
RGR Variants

Варианты для проекта "Транслятор"

Чтобы выполнить проект, следует составить спецификацию языка и затем составить язык по этой спецификации. Спецификация включает в себя

  • описание ключевой парадигмы языка (императивный, структурный, процедурный, объектно-ориентированный) и краткое описание особенностей (3-4 предложения)
  • лексическая структура: алфавит, список ключевых слов, список токенов-разделителей, список операторов.
  • синтаксические и семантические особенности: как выполнена поддержка разных типов данных
  • грамматика языка в EBNF нотации, проверенная через Flex/Bison

Варианты

Чтобы язык был уникальным и содержал интересные детали, следует выбрать из предложенных вариантов или придумать свой способ решения типовых проблем.

Способ разделения инструкций (statements)

  • Разделитель — точка с запятой: x = 10; print x;
  • Разделитель — перенос строки: x = 10;\nprint x;
  • Язык без разделителей, восстановление после ошибки в разборе инструкции происходит иным способом

Способ указания вложенности инструкций (nested statements block)

  • Вложенный блок инструкций обёрнут фигурными скобками: if (x) { ... }
  • Вложенный блок инструкций обёрнут словами BEGIN/END: if (x) BEGIN ... END
  • Вложенный блок инструкций имеет больший отступ, как в языке Python
  • Вложенный блок инструкций начинается с переноса строки после if или while и продолжается до слова end.

Набор инструкций для поддержки Structured Programming

В данном случае следует выбрать несколько инструкций из предложенного набора:

  • if с опциональным else
  • while
  • while с опциональным else (как в языке Python)
  • do / while
  • repeat / until
  • for %item% in %array%
  • foreach %item% in %array%
  • for %item% : %array%
  • for I := 1 TO 2
  • for в стиле языка C

Присваивание и сравнение

  • присваивание через =, сравнение через == (стиль C++)
  • присваивание через =, сравнение с приведением типов через ==, сравнение с проверкой типов через === (стиль Javascript)
  • присваивание через :=, сравнение через = (стиль PASCAL)
  • присваивание с объявлением через :=, обычное присваивание через =, сравнение через == (стиль Golang)

Способ реализации системы типов

  • динамическая проверка типов, переменная может менять тип во время выполнения
  • статическая проверка типов, тип указывается при объявлении справа (в стиле C):
int i = 10;
i = i + 2;
  • статическая проверка типов, тип указывается при объявлении слева (в стиле ActionScript):
var i: Number = 20;
i = i + 1;
  • статическая проверка типов, тип указывается при объявлении слева либо выводится автоматически (в стиле C++ и C#)
var x = 10; // автоматический вывод типа из инициализатора
int y = 12; // явное указание типа
  • статическая проверка типов, тип указывается при объявлении справа либо выводится автоматически (в стиле Golang)
var x int // явное указание типа
y := 10 // вывод типа из инициализатора

Вызов функций

  • аргументы в круглых скобках после имени функции (стиль C++)
setPosition(x, y);
  • аргументы в квадратных скобках вместе с именем функции, имя функции разбито на фрагменты (стиль Objective-C)
[object setX:x andY:y] // имя функции - 'setX:andY:'
  • аргументы в круглых скобках вместе с именем функции (стиль LISP)
(setPosition x y)

Объявление функций

  • функция начинается с ключевого слова def (стиль Python)
  • функция начинается с ключевого слова function (стиль ActionScript)
  • функция отличается от остальны конструкций только синтаксически (стиль C++)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment