Автор работы: Пользователь скрыл имя, 30 Октября 2009 в 19:41, Не определен
Пояснительная записка
к курсовому проекту
по дисциплине СПО
Федеральное агентство по образованию
ОМСКИЙ
ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
Кафедра
информатики и вычислительной техники
Пояснительная записка
к
курсовому проекту
по дисциплине
СПО
Выполнил:
студент гр. ИВТ-425
Елизов
В. В.
Проверил:
к.т.н., доцент
Флоренсов
А. Н.
Омск 2009
Содержание
Задание №4
Разработать на основе предиктивного анализатора интерпретатор программ для языка программирования, который описательно задается следующими определениями:
переменная операция_сравнения число
print список имен переменных
printn список имен переменных
причем оператор printn выдает округленные целые значения переменных, а для ввода оператор
input список имен переменных
где список имен переменных представляет собой перечисление через запятую;
Основным результатом работы компилятора должен быть исполняемый файл интерпретатора; в качестве дополнительного файла, выдаваемого компилятором при указании опции запроса для него, должен формироваться файл таблицы символических имен.
Представляемые
результаты разработки должны включать
пояснительную записку и
Описание разработанного языка
Разработанный интерпретатор работает с особым языком программирования, который, для упрощения, далее в тексте будет называться NL.
Алфавит языка можно разделить на 6 групп:
Для записи программы не требуется какого-либо специального формата файла. Можно использовать любое расширение.
Любая программа должна начинаться символа { и заканчиваться символом }. Они называются операторные скобки и указывают на начало и конец процедуры.
К тому же любая операция должна заканчиваться символом ; (точка с запятой).
Простейшая
программа может выглядеть
{
print 5.3;
}
При выполнении этой программы на экране появится число 5.3. Можно заметить, что оператор print выводит на экран число (значение переменной), которое следует за ним. Для вывода последовательности аргументы необходимо указать через запятую.
Также существует оператор printn, который выполняет те же самые функции, что и print, только на экран выведется лишь целочисленное значение. Например, если выполнить программу:
{
printn 5.3;
}
То на экране появится округленный результат – число 5.
Для того чтобы использовать переменную необходимо либо ввести ее значение при помощи оператора input, либо использовать присваивание (оператор :=). Переменная описывается последовательностью латинских букв, цифр и знака подчеркивания, начинающейся с буквы.
{
a:=5.3;
input b;
print a,b;
printn a,b;
}
В
вышеописанном примере
Для ввода нескольких переменных, как и для вывода можно использовать последовательность имен, перечисленных через запятую.
Язык NL позволяет выполнять простейшие операции (над числами и переменными) такие как: сложение, вычитание, умножение и деление. Которые записываются так же, как и в математике: +, -, *, /. Порядок выполнения этих операций также соответствует привычному. Для изменения приоритета нужно использовать скобки.
{
input a,b,c;
d:=(a*(a+b*b)+c)*c;
print d;
}
Для выполнения более сложных операций используется оператор условного перехода if-else – когда последовательность действий зависит от какого-либо условия. Структура условного оператора в полной форме имеет следующий вид:
if (условие) {действия1} else { действия 2};
Условие
- это выражение логического
Рассмотрим на примере работу условного оператора:
{
input a,b;
if(a==b)
{
print 10;
}
else
{
print 0;
};
}
В начале программы вводятся два числа a и b. Затем они сравниваются на равенство. Если a равно b, то будут выполняться действия, находящиеся в операторных скобках непосредственно за словом if. То есть, на экран выведется 10. Затем программа «перепрыгнет» через операторные скобки после слова else, на чем выполнение закончится. Если же условие окажется ложным (a не равно b), то пропустится первая последовательность действий и выполнится вторая, находящаяся в операторных скобках после слова else. А именно, выведется 0.
Для
выполнения повторяющихся действий
используется оператор цикла while. Структура
этого оператора имеет вид:
while (условие) {последовательность действий};,
где условие - это любое логическое выражение,
истинность которого проверяется в начале
каждой итерации (условие выполнения тела
цикла). При истинности условия выполнится
последовательность действий, находящаяся
в операторных скобках и опять проверится
условие. Так будет продолжаться до тех
пор, пока результат логического выражения
не окажется ложным. Тогда последовательность
действий перестанет выполняться и программа
перейдет к следующему за операторными
скобками действию. Следует заметить,
что если условие всегда будет выполняться,
то программа зациклится – никогда не
остановится. Ее нужно будет завершить
принудительно.
{
i:=10;
while(i>=1)
{
i:=i-1;
print i;
};
}
Выполнение данной программы приведет к тому, что на экран выведется 10 цифр – от 9 до 0.
Следует отметить, что операторы цикла, как и условные могут быть вложенными:
{
i:=10;
while(i>=1)
{
i:=i-1;
print i;
j:=i;
while(j<10)
{
j:=j+1;
print j;
};
};
}
Таким образом, язык NL позволяет реализовать довольно объемные вычисления и алгоритмы с ветвящейся структурой.
Описание модулей
Разработанная программа состоит из семи модулей:
Для описания общих переменных и внешних функций используется заголовочный файл global.h
Далее будут приведены исходные коды описанных выше файлов.
main.c
#include "global.h"
FILE* Open;
int main(int argc,char *argv[])
{
char *name=argv[1]; // Считать первый аргумент (после имени исполняемого файла) из командной строки
char *a1=argv[2]; // Считать второй аргумент
char *a2=argv[3]; // Считать третий аргумент
if((Open=fopen(name,"r"))==