Интерпретатор / readme
.docИнтерпретатор. Сдавался как лабораторная по курсу “Методы трансляции”. ФИТ НГУ 2007 год. Преподаватель: Черноножкин С.К.
Краткое описание модельного языка.
Регистр букв различается.
Типы лексем:
1) Зарезервированные слова
var, int, float, void, begin, end, if, then, else, while, do, write, return, read, waserror, exit
2) Идентификаторы
Начинаются с буквы или “_”
3) Операции почти как в плюсах:
=, ||, &&, +, -, *, /, %, ^ (возведение в степень), !, ==, !=, <, <=, >, >=
4) Разделители:
; , ( ) EOF
5) Литерал численный:
число либо число с точкой.
6) Литерал строковый:
набор символов между “”, \n – новая строка, \t - табуляция
{} – комментарии.
Переменные могут быть глобальными и локальными. Блок “begin”…”end” не локализует переменные, описанные в нем. Локальные переменные скрывают глобальные.
Выполнение начинается с функции int main(…), она всегда должна присутствовать.
Если описание функции заканчивается “;” а не блоком “begin”…”end” – это упреждающее описание, тело этой функции должно быть объявлено где-то дальше по тексту программы.
“else” относится к ближайшему “if”.
Нетерминалы – слова без кавычек,
Терминалы – слова в кавычках.
{“a”} – повторение “a” 0 или более раз,
[a|b|c] – альтернатива между a,b или c
[a]? – a встречается 0 или 1 раз
I – идентификатор,
L – численный литерал,
Ls – строковый литерал
Program -> {[VarDef|Func]}EOF
VarDef -> “var” [“int”, ”float” ] I {“,” I}
Func -> [“void”, “int”, “float” ] I “(“ [ [“int”, “float”] I {“;” [“int”, “float”] I } ]? “)” [“;”| BL]
BL -> “begin” ST {“;” ST} “end”
ST -> [
I “=” E | VarDef |
“if” E “then” ST [“else” ST]? |
“while” E “do” ST |
BL |
“return” E |
“write” “(“ [E|Ls] {“,” [E|Ls] } “)” |
“read” I |
“exit” E |
I “(“ [ E {“,” E} ]? “)”
]
E -> E1 { “||” E1 }
E1 -> E2 { “&&” E2 }
E2 -> E7 [ [“==”, ”!=”] E7 ]?
E7 -> E3 [ [“>”, ”>=”, ”<”, ”<=”] E3 ]?
E3 -> E4 { [“+”, ”-”] E4}
E4 -> E5 { [“*”, ”/”, ”%”] E5 }
E5 -> E6 [ “^” E6 ]?
E6 -> “waserror” |
L |
!E6 |
-E6 |
+E6|
(E) |
I |
I “(“ [ E {“,” E} ]? “)”
Система тестов
На вход подается файл _input.tests, в котором прописаны имена файлов для запуска с интерпретатором. Выходом является файл _output.tests c результатами тестов.
Формат входного файла:
Строки, начинающиеся с “#” – комментарии.
Строки, начинающиеся с “[” – заголовки, они переносятся в выходной файл.
Все остальные строки – имена файлов для запуска с интерпретатором. Если имя файла
начинается с “*”, результат выполнения инвертируется (удачный тест считается пройденным).
В выходном файле после каждого имени файла стоит OK или FAILED, в случае удачного теста или неудачного, соответственно.
Тест считается пройденным, если при запуске интерпретатора с этим тестом процесс вернет 0, и непройденным в остальных случаях. Не 0 возвращается, если была ошибка выполнения (напр. деление на ноль), если программа закончилась оператором exit <не ноль> или если функция main(…) закончилась оператором return <не ноль>.
Сборка
Проект написан на стандартном C++, собирался с помощью утилит GNU (gcc, make) из проекта MinGW, на других компиляторах сборка не проводилась.