Разработка транслятора на языке Си
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
Добавляем разрывы строки.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 изображен второй вариант транслируемой программы и