Скачиваний:
23
Добавлен:
01.05.2014
Размер:
32.26 Кб
Скачать

Интерпретатор. Сдавался как лабораторная по курсу “Методы трансляции”. ФИТ НГУ 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, на других компиляторах сборка не проводилась.

Соседние файлы в папке Интерпретатор
  • #
    01.05.2014450 б19factorial.test
  • #
    01.05.2014328 б19fibonacci.test
  • #
    01.05.2014727 б19nextPrimary.test
  • #
    01.05.2014404 б19nod.test
  • #
    01.05.201432.26 Кб23readme.doc