Задача A. Целые числа на Паскале

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Требуется написать программу, которая принимает на вход строку, определяет, является ли она записью знакового целого числа на языке Free Pascal, и если да, то каково значение этого числа.

Формат входных данных

Входные данные содержат одну строку.

Формат выходных данных

Первая строка выходных данных должна содержать число:

Если первая строка содержит 0, во второй строке должно содержаться значение числа в десятичной записи.

Ограничения

Длина входной строки не более 100 символов.

Примеры тестов

Стандартный вход Стандартный выход
1
$A
0
10
2
--
1
3
9999999999999999999999999
2

Задача B. Лексический анализ

Максимальный балл:10   Ограничение времени:1 сек
  Ограничение памяти:512 Мб

Условие

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

Анализатор должен определить последовательность лексем согласно выбранному вами языку программирования.

Исходный код анализатора должен быть выделен в отдельный класс/модуль, имеющий интерфейс типа итератора (т.е. функция "получить лексему" должна считывать и возвращать одну лексему без чтения остатка входного файла).

Набор лексем зависит от языка программирования, но обычно включает:

Репозиторий с анализатором должен содержать автоматические тесты, каждый тест должен включать входной и выходной файл.

Формат входных данных

Отправьте ссылку на конкретный коммит в репозитории на Github, например

https://github.com/klenin/cats-main/commit/dce22c8348808959881ed7d6852c520a41e47c9a

В качестве среды разработки укажите Answer text.

В файле README укажите свои ФИО, вуз, направление подготовки, год, анализируемый язык программирования, инструкции по запуску как самого анализатора, так и автоматических тестов.

Формат выходных данных

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

В случае обнаружения ошибки должны выводиться строка, номер символа и текст сообщения об ошибке. После этого анализатор может завершать работу.

Примеры тестов

Стандартный вход Стандартный выход
1
0x11
1 1 Integer 17 0x11

Задача C. Простые выражения

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:10  

Условие

Требуется написать программу, проводящую синтаксический анализ простейших выражений. Выражения должны удовлетворять грамматике:

expression ::= term { '+' term | '-' term }
term ::= factor { '*' factor | '/' factor }
factor ::= number | identifier | '(' expression ')'

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

Анализатор должен определить абстрактное синтаксическое дерево.

Репозиторий с анализатором должен содержать автоматические тесты, каждый тест должен включать входной и выходной файл.

Формат входных данных

Отправьте ссылку на конкретный коммит в репозитории на Github, например

https://github.com/klenin/cats-main/commit/dce22c8348808959881ed7d6852c520a41e47c9a

В качестве среды разработки укажите Answer text.

Формат выходных данных

Выходные данные должны содержать абстрактное синтаксическое дерево, изображённое с помощью отступов и, опционально, ASCII графики.

В случае обнаружения ошибки вместо дерева должна выводиться строка, номер символа и текст сообщения об ошибке. После этого анализатор может завершать работу.

Примеры тестов

Стандартный вход Стандартный выход
1
3*(5 + a)
*
├─── 3
└─── +
     ├─── 5
     └─── a

Задача D. Синтаксический анализ

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:10  

Условие

Требуется написать программу, проводящую синтаксический анализ подмножества выбранного вами языка программирования. Подмножество зависит от конкретного языка, но обычно включает следующие ограничения:

Репозиторий должен содержать файл с грамматикой реализованного подмножества. Грамматика должна быть получена путём удаления части стандартной грамматики для выбранного языка. Реализованное подмножество должно быть строгим, то есть стандартный компилятор / интерпретатор должен принимать любую программу, которую принимает ваш анализатор.

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

Анализатор должен определить абстрактное синтаксическое дерево.

Репозиторий с анализатором должен содержать автоматические тесты, каждый тест должен включать входной и выходной файл.

Формат входных данных

Отправьте ссылку на конкретный коммит в репозитории на Github, например

https://github.com/klenin/cats-main/commit/dce22c8348808959881ed7d6852c520a41e47c9a

В качестве среды разработки укажите Answer text.

Формат выходных данных

Выходные данные должны содержать абстрактное синтаксическое дерево, изображённое с помощью отступов и, возможно, ASCII графики.

В случае обнаружения ошибки вместо дерева должна выводиться строка, номер символа и текст сообщения об ошибке. После этого анализатор может завершать работу.


Задача E. Семантический анализ

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:10  

Условие

Требуется написать программу, проводящую семантический анализ подмножества выбранного вами языка программирования. Подмножество зависит от конкретного языка, но обычно включает следующие ограничения:

Репозиторий должен содержать файл с грамматикой реализованного подмножества. Грамматика должна быть получена путём удаления части стандартной грамматики для выбранного языка. Реализованное подмножество должно быть строгим, то есть стандартный компилятор / интерпретатор должен принимать любую программу, которую принимает ваш анализатор.

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

Анализатор должен определить абстрактное синтаксическое дерево и таблицы символов.

Репозиторий с анализатором должен содержать автоматические тесты, каждый тест должен включать входной и выходной файл.

Анализатор должен определять все виды семантических ошибок, включая несоответствие типов, необъявленные переменные и т.п.

Формат входных данных

Отправьте ссылку на конкретный коммит в репозитории на Github, например

https://github.com/klenin/cats-main/commit/dce22c8348808959881ed7d6852c520a41e47c9a

В качестве среды разработки укажите Answer text.

Формат выходных данных

Выходные данные должны содержать абстрактное синтаксическое дерево, изображённое с помощью отступов и, возможно, ASCII графики.

В случае обнаружения ошибки вместо дерева должна выводиться строка, номер символа и текст сообщения об ошибке. После этого анализатор может завершать работу.


Задача F. Генерация кода

Максимальный балл:10   Ограничение времени:1 сек
  Ограничение памяти:512 Мб

Условие

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

Сгенерированный код должен быть написан на языке программирования машинного уровня, например языке Ассемблера, WebAssembly, JVM, CLR.

Дальнейший перевод сгенерированного кода в машинный код (либо запуск в случае кода для VM) должен осуществляться стандартными инструментами, например nasm, gcc, java. Инструкции по установке необходимых инструментов должны быть включены в файл README.

Компилятор должен иметь отдельные ключи для режимов "сгенерировать код и остановиться", "сгенерировать код и транслировать его в исполняемый файл / исполнить".

Тесты НЕ должны проверять текстовое содержимое сгенерированного кода. Вместо этого они должны запускать полученные исполняемые модули и сравнивать полученный от них вывод с эталонным.

Дополнительно рекомендуется вместо ручного составления эталонного вывода получать его запуском стаднартного компилятора (например fpc, gcc) на том же самом исходном коде.

Формат входных данных

Отправьте ссылку на конкретный коммит в репозитории на Github, например

https://github.com/klenin/cats-main/commit/dce22c8348808959881ed7d6852c520a41e47c9a

В качестве среды разработки укажите Answer text.

Формат выходных данных

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


Задача G. Оптимизация

Максимальный балл:20   Ограничение времени:1 сек
  Ограничение памяти:512 Мб

Условие

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

Дальнейшие шаги по компиляции и тестированию кода аналогичны заданию "Генерация кода".

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

Компилятор должен иметь отдельные ключи, включающие каждое преобразование, а также ключ "включить все оптимизации".

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

Рекомендуется в первую очередь рассмотреть следующие оптимизации:

Формат входных данных

Отправьте ссылку на конкретный коммит в репозитории на Github, например

https://github.com/klenin/cats-main/commit/dce22c8348808959881ed7d6852c520a41e47c9a

В качестве среды разработки укажите Answer text.

Формат выходных данных

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


0.294s 0.015s 25