Разработка транслятора на языке Си

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



Добавляем разрывы строки.AppendChar('\n');//Добавляем разрывы строки++;

}.Close();//Закрываем текстовый файл.(nID,szOut);//Выводим текст в элемент диалогового окна.

}Cp2cDlg::fWrite(UINT nID, CString* String)//Функция производит запись результата в файл.

{szOut="";//Создаем пустую строку, для вывода результата.Outputfile;//Создаем объект для файла.FileExc; //Объект исключений для файлаnOpenFlags;//Флаг открытия= CFile::modeWrite | CFile::modeCreate;//Создаем файл

//Если файл не открывается(!Outputfile.Open("CodeC.txt", nOpenFlags, &FileExc))

{.ReportError();//Выводим стандартное сообщение об ошибке;

}i=0;(String[i]!="")//Пока строка не пуста

{.Append(String[i]);//Добавляем текущую строку в строку результата..AppendChar('\r');//Добавляем разрывы строки.AppendChar('\n');//Добавляем разрывы строки.WriteString(String[i]+'\n');//Записываем строку в файл, добавляя \n в конец.++;

}.Close();//Закрываем файл(nID,szOut);//Выводим текст в элемент диалогового окна.

}Cp2cDlg::fComment(CString* String)//Функция для обработки комментариев.

{ int nach=-1,kon=-1;//Переменные, в которых будет храниться порядковый номер определенных комбинаций символов.=String->Find("{");//Присваиваем переменной номер искомого символа, если символ присутствует в строке,

//то значение будет больше нуля.(nach>=0)//Если символ присутствует

{>Insert(nach,'/');//Вставляем необходимые символы>Insert(nach+1,'*');>Delete(nach+2,1);//Удаляем скобки комментариев на языке Паскаль.

}=String->Find("}");//Аналогичные действия, только для закрывающихся скобок.(kon>=0)

{>Delete(kon,1);>Insert(kon,'*');>Insert(kon+1,'/');

}=-1,kon=-1;=String->Find("(*");//Выполняем аналогичные действия с другим видом комментариев на Паскале.(nach>=0)

{>Delete(nach,2);>Insert(nach,'/');>Insert(nach+1,'*');

}=String->Find("*)");(kon>=0)

{>Insert(kon,'*');>Insert(kon+1,'/');>Delete(kon+2,2);

}

}Cp2cDlg::fvar(CString* String)//Функция обрабатывает объявление переменных и массива целочисленного типа и оператора присваивания.

{rav=-1,inte=-1,arr=-1,var=-1;//Переменные, в которых будет храниться порядковый номер определенных комбинаций символов.=String->Find(":=");//Ищем оператор присваивания=String->Find("var");//Ищем объявление переменных(rav>=0)

{>Delete(rav,2);//Удаляем оператор присваивания

}(var>=0)

{>Delete(var,4);//Удаляем оператор объявления переменных VAR.

}=String->Find("integer");//Ищем объявление целочисленного типа(inte>=0)

{>Delete(inte,7);//Удаляем объявление целочисленного типа>Delete(String->Find(":"));//Удаляем лишние символы>Insert(0,"int ");//Вставляем в начало строки объявление целочисленного типа для С++

}=String->Find("array");//Ищем объявление массива(arr>=0)

{>Delete(arr,5);//Удаляем array>Delete(String->Find("of"),2);//Удаляем лишние символы>Delete(String->Find("..")-1,1);>Delete(String->Find(".."),2);

}

}Cp2cDlg::fMain(CString* String)//Функция ищет и заменяет операторные скобки и объявляет функцию void main()

{prg=-1,beg=-1,end=-1,end1=-1; //Переменные, в которых будет храниться порядковый номер определенных комбинаций символов.=String->Find("program");//Производим поиск ключевых слов=String->Find("begin");=String->Find("end;");=String->Find("end.");(prg>=0)

{>Delete(0,String->GetLength());//Очищаем строку>Append("void main(void)");//Вставляем объявление ф-ции void main()

}(beg>=0)

{>Delete(beg,5);//Удаляем операторные скобки на языке Паскаль>Insert(beg,"{");//Вставляем операторные скобки на языке С++

}(end>=0)

{>Delete(end,4);//Удаляем операторные скобки на языке Паскаль>Insert(end,"}");//Вставляем операторные скобки на языке С++

}(end1>=0)

{>Delete(end,4);//Удаляем операторные скобки на языке Паскаль>Insert(end,"}");//Вставляем операторные скобки на языке С++

}

}Cp2cDlg::fWhile(CString* String)//Функция обрабатывает цикл while и логические операторы

{wh=-1,le1=-1,le2=-1;//Переменные, в которых будет храниться порядковый номер определенных комбинаций символов.=String->Find("while");//Производим поиск ключевых слов(wh>=0)

{>Insert(6,"(");>Insert(String->Find("do")-1,")");>Delete(String->Find("do"),2);

}=String->Find("=0)

{>Insert(String->Find(""),2);//Удаляем логический оператор "не равно" на языке Паскаль

}=String->Find("=");//Производим поиск логического оператора "равно"(le2>=0 && le1<0)

{(String->Find(":")Find("!")<0)//Эта проверка необходима для того, что бы не добавить лишнее "="

//к оператору присваивания или к оператору "не равно".

{>Insert(le2,"=");//Вставляем логический оператор "равно" на языке С++

}

}

}Cp2cDlg::OnBnClickedButton2()

{();//Закрываем диалоговое окно программы.

}

. Описание тестовых прогонов

Чтобы протестировать корректную работу программы в случае появления внештатных ситуаций, попробуем для файла, в который будет производиться запись, поставить атрибут "Только чтение". При попытки трансляции исходного кода и записи его в файл появляется окно с сообщением об ошибке, изображенное на рисунке 6.

Рисунок 6 - Окно с сообщением об ошибке записи

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

Рисунок 7 - Окно с сообщением об ошибке чтения

Следующим этапом тестирования будет проверка корректности трансляции исходного кода на Паскале в исходный код на С++.

На рисунке 8 изображен первый вариант транслируемой программы и результат трансляции.

Рисунок 8 - Трансляция первой тестовой программы

На рисунке 9 изображен второй вариант транслируемой программы и