Разработка транслятора для перевода программы, написанной на языке Паскаль, в текст программы на языке Си
Создание транслятора, обрабатывающего код программы на языке Паскаль и за счет эквивалентных операторов генерирующего программу на Си. Особенности внешней спецификации и работы лексического анализатора. Структура программы, вывод результатов на экран.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 02.07.2011 |
Размер файла | 254,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Государственное образовательное учреждение высшего профессионального образования
«Северо-Кавказский государственный университет»
КУРСОВОЙ ПРОЕКТ
по дисциплине «Программирование на языке высокого уровня»
Вариант 8
Исполнитель:
Заболотнев В.А.
Группа АСОУ-091
Руководитель:
Братченко Н.Ю.
Ставрополь 2011
Оглавление
Введение
1. Постановка задачи
2. Внешняя спецификация
3. Описание алгоритма
4. Структура программы и описание функций и операторов
5. Листинг программы
6. Распечатка тестов и результатов
Выводы
Список литературы
Введение
Язык программирования Си, а точнее его развитие Си++, на сегодняшний день является самым распространенным языком программирования. Он завоевал такую славу благодаря своей гибкости и скорости работы. С другой же стороны язык Паскаль был создан для обучения, и не столь гибок и эффективен. Но, несмотря на это, на нем написано множество различных программ. Написание транслятора позволит увеличить рынок потенциальных разработчиков, а так же повысит быстродействие программы. Конечно, после этого программу следует доработать человеком, но вся рутинная работа по переводу программы будет выполнено транслятором.
1. Постановка задачи
транслятор программа язык паскаль лексический
Заданием курсового проекта является написание транслятора, обрабатывающего следующие конструкции:
- char
- case
- assign
- rewrite
- write
- файлы
А так же арифметическое выражение (рис. 1.1) и логическое выражение (рис. 1.2)
Транслятор пишется на языке Си. Программа должна обрабатывать код программы на языке Паскаль и за счет эквивалентных операторов генерировать программу на Си.
Арифметическое выражение Ae2:
Рисунок 1.1 - Схема разбора арифметического выражения
Логическое выражение Le2:
Рисунок 1.2 - Схема разбора логического выражения
В качестве задания, приведем таблицу правил перевода операторов.
Таблица 1.1 - Таблица синонимичных операторов
Конструкция на Паскале |
Эквивалентная конструкция на Си |
|
Операторные скобки begin…end |
{...} |
|
Оператор var |
||
var <name>:<type>; <name>,<name>:<type>; label <name>; |
<type> <name>,<name>; <type> <name>; |
|
Тип переменной |
||
<name>:char; |
char <name>; |
|
Rewrite(<name>) |
createFile(<name>) |
|
Assign(<name>,<path>) |
<name> = fopen(<path>,”w”) |
|
Write(<file>,'<text>') |
fprintf(<file>,”text”) |
|
<name> = file of <type> |
FILE * <name> |
|
case <name> of <name> : <operator >; <name> : <operator>; end; |
switch(<name>){ case <name>: <operator>; case <name>:<operator> |
|
{ комментарий 1 } (*комментарий 2*) |
/*комментарий 1*/ /*комментарий 2*/ |
Приведем пример перевода программы с языка Си на Паскаль
Таблица 1.2 - Вид программы на Паскале и Си
Паскаль |
Си |
|
var i,k:integer; m:char; fl:file of char; begin assign(fl,'c:tuc\tuc.txt'); rewrite(fl); Case k of 1 : Begin write('text'); End; 2 : Begin write('text1'); End; 3 : Begin write(fl,'text to file'); End; End; {End Case1} end. |
#include <stdio.h> int i,k; char m; FILE *fl; void main() { fl = fopen("c:tuc\tuc.txt","w"); fcreate(fl); switch(k){ case 1: { printf("text); break; case 2: { printf("text1); break; case 3: { fprintf(fl,"text to file"); break; }/*End Case1*/ } |
2. Внешняя спецификация
На вход программы будет поступать входной файл. При этом на экран будет выведено сообщение:
Пожалуйста, укажите файл для трансляции:
Имя результирующего файла тоже задается пользователем, таким образом, на экран будет выведено сообщение:
Пожалуйста, введите имя для транслята:
Программой должны быть предусмотрены ошибки ввода, такие как, к примеру: файла не существует, файл не подходит, файл не может быть создан. При этом на экран должны быть выведены соответствующие сообщения.
Программа будет не требовательна к аппаратному обеспечению. Компьютер оснащенный 500 Гц процессором и оперативной памятью более 32 Мб подойдет.
3. Описание алгоритма
Практически во всех трансляторах (и в компиляторах, и в интерпретаторах) в том или ином виде присутствует большая часть перечисленных ниже процессов:
· лексический анализ
· синтаксический анализ
· семантический анализ
· генерация внутреннего представления программы
· оптимизация
· генерация объектной программы.
В конкретных компиляторах порядок этих процессов может быть несколько иным, некоторые из них могут объединяться в одну фазу, другие могут выполнятся в течение всего процесса компиляции. В интерпретаторах и при смешанной стратегии трансляции некоторые этапы могут вообще отсутствовать.
В нашей работе мы не будем реализовывать этап оптимизации и генерации объектной программы, т.к это этапы построения компиляторов, а мы лишь касаемся первой части - трансляции.
Поэтому наиболее разумным будет построение однопроходного транслятора. Лексический анализатор читает фрагмент исходного текста, необходимый для получения одной лексемы. После формирования лексемы им осуществляется вызов синтаксического анализатора и передача ему созданной лексемы в качестве параметра. Если синтаксический анализатор может построить очередной элемент промежуточного представления, то он делает это и передает построенный фрагмент генератору кода. В противном случае синтаксический анализатор возвращает управление сканеру, давая, тем самым, понять, что очередная лексема обработана и нужны новые данные.
Генератор кода функционирует аналогичным образом. По полученному фрагменту промежуточного представления он создает соответствующий фрагмент объектного кода. После этого управление возвращается синтаксическому анализатору.
По окончании исходного текста и завершении обработки всех промежуточных данных каждым из блоков лексический анализатор инициирует процесс завершения программы.
4. Структура программы и описание функций и операторов
Назначение подпрограмм:
Main - главная программа, осуществляющая проход синтаксического и лексического анализатора
IsCommen - Подпрограмма обработки комментариев
Var - подпрограмма обработки блока var и определяющие их типы как file или char в соответствии запускаются подпрограммы:
File - подпрограмма обработки файловой переменной
char - подпрограмма обработки символьной переменной
Write - подпрограмма обрабатывающая оператор write и в зависимости от его записи запускает подпрограммы:
toFile - подпрограмма обрабатывающая write при записи в файл
toScreen - обрабатывает write как обычный вывод сообщения на экран
rewrite - подпрограмма обрабатывающая оператор rewrite
assign - подпрограмма обрабатывающая оператор assign(<file>,<path>) и переводящая его в <file> = fopen(<path>,”w”)
case - подпрограмма обрабатывающая оператор case. Возможно указание вложенных операторов case, операторных скобок или же их отсутствие.
begin - подпрограмма обработки сложных case функций, может так же обрабатывать любые блоки начинающиеся с begin и заканчивающиеся ключевым словом end
simple - подпрограмма обрабатывающая простые конструкции case
Таблицы идентификаций:
Таблица 1.3 - Таблица ключевых слов
Оператор или ключевое слово |
Номер |
|
begin |
1 |
|
end |
2 |
|
var |
3 |
|
Char |
4 |
|
boolean |
5 |
|
False |
6 |
|
true |
7 |
|
and |
8 |
|
or |
9 |
|
case |
10 |
|
assign |
11 |
|
write |
12 |
|
rewrite |
13 |
Таблица 1.4 - Таблица типов переменных
Тип |
Идентификационный номер |
|
Целочисленный |
1 |
|
Символьный |
2 |
|
Логический |
3 |
|
Файл |
4 |
Таблица 1.5 - Таблица типов слов
Тип слова |
Идентификационный номер |
|
Ошибка |
0 |
|
Пробел |
1 |
|
Строка |
2 |
|
Число |
3 |
|
Символ |
4 |
5. Листинг программы
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <locale.h>
FILE *file1, *file2;
const int maxLen = 10000;
const int KWn = 13;
char * KWs[KWn] =
{
"begin", "end", "var", "char",
"boolean", "false", "true", "and",
"or", "case", "assign", "write",
"rewrite"
};
#define ww_begin 1
#define ww_end 2
#define ww_var 3
#define ww_char 4
#define ww_boolean 5
#define ww_false 6
#define ww_true 7
#define ww_and 8
#define ww_or 9
#define ww_case 10
#define ww_assign 11
#define ww_write 12
#define ww_rewrite 13
#define t_Int 1
#define t_char 2
#define t_Bool 3
#define t_File 5
#define w_error 0
#define w_space 1
#define w_str 2
#define w_numb 3
#define w_char 4
char pasfile[maxLen],
cfile[maxLen];
int inlen,outlen,paspos;
int pasop,cop,ker;
int wordLen;
int wordType;
int wordNumf;
int dt;
typedef struct var{
char s[64];
int tp;
var * next;
};
var *vars, *lvars;
int fle();
int addvar(int isGl){
var *np, *p;
if (isGl) p = vars; else p = lvars;
while (p) {
if (strlen(p->s)==wordLen&&
!memcmp(p->s,&pasfile[paspos],wordLen)) return 0;
p = p->next;
}
np = new var;
memcpy(np->s,&pasfile[paspos],wordLen);
np->s[wordLen]=0;
np->tp = -1;
if (isGl) {
np->next = vars;
vars = np;
} else {
np->next = lvars;
lvars = np;
}
return 1;
}
void sttov(int isGl, int type){
var *p;
if (isGl) p = vars; else p = lvars;
while (p) {
if (p->tp==-1) p->tp = type;
p = p->next;
}
}
int wivp(){
var * p;
p = lvars;
while (p) {
if (strlen(p->s)==wordLen&&
!memcmp(p->s,&pasfile[paspos],wordLen)) return p->tp;
p = p->next;
}
p = vars;
while (p) {
if (strlen(p->s)==wordLen&&
!memcmp(p->s,&pasfile[paspos],wordLen)) return p->tp;
p = p->next;
}
return 0;
}
void freevars(int isGl){
var *p, *pp;
p = lvars;
while (p) {
pp = p;
p = p->next;
delete pp;
}
lvars = NULL;
if (isGl) {
p = vars;
while (p) {
pp = p;
p = p->next;
delete pp;
}
vars = NULL;
}
}
int takeLex()
{
int st = 0;
char c;
wordLen = 0;
while (wordLen+paspos<inlen){
c = pasfile[paspos+wordLen];
switch (st){
case 0:
if (c==' ' || c=='\t' || c=='\n') st = 1;
else
if ((c>='A' && c<='Z')||(c>='a' && c<='z')) st = 2;
else
if (c>='0' && c<='9') st = 3;
else
if (
c=='.' || c<=',' || c >=':' || c<=';' ||
c=='+' || c<='-' || c>='*' || c<='/' ||
c=='\''
)
{ wordLen = 1; return wordType = w_char; }
else { wordLen = 0; return wordType = w_error; }
break;
case 1:
if (c==' ' || c=='\t' || c=='\n') wordLen++;
else return wordType = w_space;
break;
case 2:
if (
(c>='A' && c<='Z') ||
(c>='a' && c<='z') ||
(c>='0' && c<='9') ||
c=='_'
) wordLen++;
else return wordType = w_str;
break;
case 3:
if (c>='0' && c<='9') wordLen++; else
if (c=='.'&& pasfile[paspos+wordLen+1]!='.') {
wordLen++;
st = 5;
}
else{
wordNumf = 0;
return wordType = w_numb;
}
break;
case 5:
if (c>='0' && c<='9') wordLen++; else {
wordNumf = 1;
return wordType = w_numb;
}
}
}
wordLen = 0;
return 0;
}
void str_pt(char * s){
int l = strlen(s);
memcpy(&cfile[outlen],s,l);
outlen += l;
}
int scmp(char * m, char * s, int n){
int l = strlen(s);
if (n>l) l = n;
return memicmp(m,s,l);
}
void put_char(char c){
cfile[outlen] = c;
outlen++;
}
void trCpy(){
memcpy(&cfile[outlen],&pasfile[paspos],wordLen);
paspos += wordLen;
outlen += wordLen;
}
int trEqu(char * s){
return (!scmp(&pasfile[paspos],s,wordLen));
}
void wr_skip(){
paspos += wordLen;
}
void wstr(char * s){
strncpy(s,&pasfile[paspos],wordLen);
}
int IsWrd(){
takeLex();
if (wordType==w_space) {
wr_skip();
takeLex();
}
return wordType;
}
void inc_dt()
{
dt += 2;
}
void dt_pl()
{
dt -= 2;
}
void dt_pt()
{
for (int i=0; i<dt; i++) put_char(' ');
}
void put_dt11()
{
char s[10];
for (int i=0; i<dt; i++) {
sprintf(s,"%d",i/2);
str_pt(s);
}
}
int i_file(char * s1)
{
if ((file1 = fopen(s1, "rt")) == NULL){
return 0;
}
fseek(file1, 0, SEEK_END);
inlen = ftell(file1);
fseek(file1, 0, SEEK_SET);
if (inlen>maxLen) inlen = maxLen;
inlen = fread(pasfile,1,inlen,file1);
pasfile[inlen] = 0;
paspos = 0;
outlen = 0;
return 1;
}
int o_file(char * s2)
{
if ((file2 = fopen(s2, "wt")) == NULL){
return 0;
}
fwrite(cfile,outlen,1,file2);
return 1;
}
void op_err()
{
put_char('\n');
str_pt("< Ошибка! > \n");
int k;
while (1){
IsWrd();
if (pasfile[paspos]== ';' || paspos>= inlen) {
trCpy();
break;
};
trCpy();
}
ker++;
}
int f_commen(){
return (pasfile[paspos]=='{' ||
pasfile[paspos]=='(' ||pasfile[paspos+1]=='*');
}
void f_endcommen(){
if (pasfile[paspos]=='{'){
cfile[outlen] = '/';
cfile[outlen+1] = '*';
paspos++;
outlen += 2;
while (pasfile[paspos]!='}' && paspos<inlen) {
if (paspos>=inlen) return;
cfile[outlen] = pasfile[paspos];
paspos++;
outlen++;
}
cfile[outlen] = '*';
cfile[outlen+1] = '/';
paspos++;
outlen += 2;
}
else{
cfile[outlen] = '/';
cfile[outlen+1] = '*';
paspos += 2;
outlen += 2;
while (!(pasfile[paspos]=='*' && pasfile[paspos+1]==')')
&& paspos<inlen) {
if (paspos>=inlen) return;
cfile[outlen] = pasfile[paspos];
paspos++;
outlen++;
}
cfile[outlen] = '*';
cfile[outlen+1] = '/';
paspos += 2;
outlen += 2;
}
put_char('\n');
}
int ifKw(){
for (int i=0; i<KWn; i++){
if (!scmp(&pasfile[paspos],KWs[i],wordLen))
return i+1;
}
return 0;
}
int varOpT(int svar, int isGl){
char s[256];
int label;
int sp = 0;
IsWrd();
while (1){
if (wordType!=w_str||ifKw()|| isGl>0&&wivp()) return 0;
addvar(isGl);
if (svar) {
s[sp] = '&';
s[sp+1] = ' ';
sp += 2;
}
memcpy(&s[sp],&pasfile[paspos],wordLen);
paspos += wordLen;
sp += wordLen;
IsWrd();
if (pasfile[paspos]==','){
s[sp]=',';
paspos++;
sp++;
} else break;
IsWrd();
}
if (pasfile[paspos]==':'){
paspos++;
IsWrd();
if (wordType!=w_str) return 0;
if (!scmp(&pasfile[paspos],"boolean",wordLen)){
sttov(isGl,t_Bool);
str_pt("int ");
wr_skip();
memcpy(&cfile[outlen],&s[0],sp);
outlen += sp;
}
else
if (!scmp(&pasfile[paspos],"char",wordLen)){
sttov(isGl,t_char);
str_pt("char ");
wr_skip();
memcpy(&cfile[outlen],&s[0],sp);
outlen += sp;
}
else
if (!scmp(&pasfile[paspos],"integer",wordLen)){
sttov(isGl,t_Int);
str_pt("int ");
wr_skip();
memcpy(&cfile[outlen],&s[0],sp);
outlen += sp;
}
else
if(trEqu("file"))
{
wr_skip();
IsWrd();
if(!trEqu("of")) return 0;
wr_skip();
IsWrd();
str_pt("FILE *");
memcpy(&cfile[outlen],&s[0],sp);
outlen += sp;
wr_skip();
sttov(isGl,t_File);
}
}
else return 0;
return 1;
}
int fvarBlk(int isGl){
paspos += wordLen;
IsWrd();
do{
pasop++;
if (f_commen()){
f_endcommen();
cop++;
continue;
}
dt_pt();
if (!varOpT(0,isGl)) op_err();
else cop++;
IsWrd();
if (pasfile[paspos]!=';')
return 0;
wr_skip();
str_pt(";\n");
IsWrd();
if (wordType!=w_str || ifKw())
return 1;
}while(1);
}
int isVarBlk(){
paspos += wordLen;
int k,svar;
IsWrd();
do{
k = ifKw();
svar = k==ww_var;
if (svar) {
wr_skip();
IsWrd();
}
if (!varOpT(svar,0)) return 0;
IsWrd();
if (pasfile[paspos]!=';') return 1;
wr_skip();
str_pt(", ");
IsWrd();
k= ifKw();
if (wordType!=w_str || k&&k!=ww_var) return 0;
}while(1);
}
int mainScope(int k);
int fgoto()
{
wr_skip();
dt_pt();
str_pt("goto ");
IsWrd();
trCpy();
if (pasfile[paspos]!=';') return 0;
str_pt(";\n");
paspos++;
return 1;
}
int fcase()
{
int beg;
wr_skip();
dt_pt();
str_pt("switch");
str_pt("(");
IsWrd();
trCpy();
str_pt("){\n");
IsWrd();
if (!trEqu("of")) return 0;
wr_skip();
while(1)
{
IsWrd();
if (trEqu("end")) {
wr_skip();
paspos++;
dt_pl();
dt_pt();
str_pt("}\n");
break;
}
dt_pt();
str_pt("case ");
if ((wordType!=w_str)&&(wordType!=w_numb)&&(wordType!=w_char)) return 0;
if (pasfile[paspos]=='\'') {wr_skip(); str_pt("\'");}
IsWrd();
trCpy();
if (pasfile[paspos]=='\'') {wr_skip(); str_pt("\'");}
IsWrd();
if (pasfile[paspos]!=':') return 0;
trCpy();
IsWrd();
beg = 0;
if (trEqu("begin")) {wr_skip(); beg = 1;};
str_pt("\n");
inc_dt();
mainScope(3);
dt_pl();
if (trEqu("end")&&beg)
{
dt_pt();
str_pt("break;\n");
wr_skip();
if(pasfile[paspos]==';') paspos++;
} else { dt_pt(); str_pt("break;\n");}
}
return 1;
}
int frewrite()
{
wr_skip();
if (pasfile[paspos]!='(') return 0;
paspos++;
dt_pt();
str_pt("fcreate(");
IsWrd();
if(wivp()!=t_File) return 0;
trCpy();
if (pasfile[paspos]!=')') return 0;
paspos++;
str_pt(")");
if (pasfile[paspos]!=';') return 0;
paspos++;
str_pt(";\n");
return 1;
}
int fassign()
{
int t;
wr_skip();
if (pasfile[paspos]!='(') return 0;
paspos++;
IsWrd();
if(t = wivp())
{
if(t==t_File)
{
dt_pt();
trCpy();
str_pt(" = fopen(\"");
if(pasfile[paspos]!=',') return 0;
paspos+=2;
while (pasfile[paspos]!= '\'')
{
cfile[outlen] = pasfile[paspos];
paspos++;
outlen++;
}
paspos++;
str_pt("\"");
str_pt(",\"w\"");
IsWrd();
if (pasfile[paspos]!=')') return 0;
paspos++;
str_pt(")");
if (pasfile[paspos]!=';') return 0;
paspos++;
str_pt(";\n");
return 1;
}
}
return 1;
}
int fwrite(int ln){
char s[256];
int sp;
int t;
wr_skip();
dt_pt();
IsWrd();
if (pasfile[paspos]!='(') return 0;
paspos++;
/* Обработка файла */
IsWrd();
if(t = wivp())
{
if(t==t_File)
{
str_pt("fprintf(");
trCpy();
if(pasfile[paspos]!=',') return 0;
paspos+=2;
str_pt(",\"");
while (pasfile[paspos]!= '\'')
{
cfile[outlen] = pasfile[paspos];
paspos++;
outlen++;
}
paspos++;
str_pt("\"");
IsWrd();
if (pasfile[paspos]!=')') return 0;
paspos++;
str_pt(")");
if (pasfile[paspos]!=';') return 0;
paspos++;
str_pt(";\n");
return 1;
}
}
str_pt("printf");
put_char('(');
IsWrd();
if (pasfile[paspos]!='\'') return 0;
put_char('"');
paspos++;
while (pasfile[paspos]!= '\'') {
cfile[outlen] = pasfile[paspos];
paspos++;
outlen++;
}
paspos++;
if (pasfile[paspos]==')')
{
if (ln) str_pt("\\n");
put_char(')');
paspos++;
if (pasfile[paspos]!=';') return 0;
paspos++;
str_pt(";\n");
return 1;
}
if (pasfile[paspos]!=',') return 0;
paspos++;
sp=0;
while (1) {
IsWrd();
if (wordType!=w_str) return 0;
t = wivp();
if (t==t_Int) str_pt("%d");
else if (t==t_char) str_pt("%f");
else return 0;
memcpy(&s[sp],&pasfile[paspos],wordLen);
paspos += wordLen;
sp += wordLen;
IsWrd();
if (pasfile[paspos]!=',') break;
s[sp] = pasfile[paspos];
paspos++;
sp++;
}
if (ln) str_pt("\\n");
put_char('"');
IsWrd();
str_pt("\,");
memcpy(&cfile[outlen],s,sp);
outlen += sp;
IsWrd();
if (pasfile[paspos]!=')') return 0;
paspos++;
put_char(')');
IsWrd();
if (pasfile[paspos]!=';') return 0;
paspos++;
str_pt(";\n");
return 1;
}
int fae() {
IsWrd();
if (pasfile[paspos]=='+'){
trCpy();
}
else
if (pasfile[paspos]=='-'){
trCpy();
}
while (1){
IsWrd();
if (wordType==w_numb) trCpy(); else
if (wordType==w_str&&wivp()==t_Int) trCpy(); else
if (wordType==w_str&&wivp()==t_char) trCpy(); else
if (pasfile[paspos]=='('){
trCpy();
if (!fae()) return 0;
IsWrd();
if (pasfile[paspos]!=')') return 0;
paspos++;
put_char(')');
}
else return 0;
IsWrd();
char c = pasfile[paspos];
if (c=='+'||c=='-'||c=='*'||c=='/') trCpy();
else return 1;
}
}
int ae(){
char c,c1;
if (!fae()) return 0;
IsWrd();
c = pasfile[paspos];
c1 = pasfile[paspos+1];
if (c=='<'&&c1=='>') {
paspos += 2;
str_pt("!=");
}
else
if (c=='=') {
paspos++;
str_pt("==");
}
else
if (c=='>'||c=='<') {
if (c1=='='){
paspos += 2;
}
else trCpy();
}
IsWrd();
if (!fae()) return 0;
return 1;
}
int fle() {
int k;
char c,c1;
int arifm, ip,op;
while (1){
IsWrd();
k = ifKw();
int ip, op;
ip = paspos;
op = outlen;
arifm = 0;
if(pasfile[paspos]=='+'||
pasfile[paspos]=='('||
pasfile[paspos]=='-'||
wordType==w_str&&!ifKw() ||
wordType==w_numb)
arifm = ae();
if (!arifm){
paspos = ip;
outlen = op;
IsWrd();
k = ifKw();
if (wordType==w_str&&k==ww_true){
wr_skip();
put_char('1');
}
else
if (wordType==w_str&&k==ww_false) {
wr_skip();
put_char('0');
}
else
if (wordType==w_str&&wivp()==t_Bool) trCpy(); else
if (pasfile[paspos]=='('){
trCpy();
if (!fle()) return 0;
IsWrd();
if (pasfile[paspos]!=')') return 0;
paspos++;
put_char(')');
}
else return 0;
}
IsWrd();
k = ifKw();
if (k==ww_or) str_pt("||"); else
if (k==ww_and) str_pt("&&");
else return 1;
wr_skip();
}
}
int asign(){
int type = wivp();
if (!(type==t_Bool||type==t_char||type==t_Int)) return 0;
dt_pt();
trCpy();
IsWrd();
if (pasfile[paspos]!=':'||pasfile[paspos+1]!='=')
return 0;
put_char('=');
paspos += 2;
if (type==t_Bool) {
if (!fle()) return 0;
}
else
if (!fae()) return 0;
IsWrd();
if (pasfile[paspos]!=';') return 0;
trCpy();
put_char('\n');
return 1;
}
int mainScope(int isGl){
int rep_n = 0;
if(isGl!=3) wr_skip();
if (isGl==1) str_pt("\n\nvoid main()\n");
if ((isGl!=2)||(isGl!=3)) {
dt_pt();
str_pt("{\n");
inc_dt();
}
int b;
do{
b = 1;
IsWrd();
if (f_commen()){
f_endcommen();
continue;
}
switch(ifKw()){
case ww_begin:
pasop++;
if (!mainScope(0)) return 0;
cop++;
break;
case ww_case:
pasop++;
if (!fcase()) return 0;
break;
case ww_write:
pasop++;
if (!fwrite(0)) return 0;
cop++;
break;
case ww_rewrite:
pasop++;
if (!frewrite()) return 0;
cop++;
break;
case ww_assign:
pasop++;
if (!fassign()) return 0;
cop++;
break;
case ww_end:
pasop++;
if(isGl == 3) return 3;
wr_skip();
dt_pl();
dt_pt();
str_pt("}\n");
IsWrd();
if (isGl==1&&pasfile[paspos]=='.' ||
isGl!=1&&pasfile[paspos]==';'){
wr_skip();
cop++;
return 1;
}
else
{
wr_skip();
return 0;
}
case 0:
if (!asign()) return 0;
break;
default:
return 0;
}
} while (b);
return 1;
}
int Translate()
{
int b;
int k;
pasop = cop = 0;
str_pt("#include <stdio.h>\n\n");
do{
b = 1;
IsWrd();
k = ifKw();
if (k==ww_var){
pasop++;
if (!fvarBlk(1)) {
op_err();
}
else cop++; }
else
if (k==ww_begin){
if (!mainScope(1)) {
op_err();
}
b = 0;
}
else
if (f_commen()) f_endcommen();
else {
pasop++;
op_err();
};
} while (b==1);
if (pasfile[paspos]!='.') return 0;
paspos++;
return 1;
}
void main()
{
setlocale(LC_ALL,"Russian");
char s[128];
printf("Пожалуйста, укажите файл для трансляции: ");
scanf("%s",s);
if (!i_file(s))
{
printf("\nОшибка открытия файла!");
getch();
return;
}
vars = NULL;
lvars = NULL;
Translate();
freevars(1);
printf("\nПожалуйста, введите имя для транслята:");
scanf("%s",s);
if (!o_file(s))
{
printf("\nОшибка создания файла!");
getch();
return;
}
printf("\nОператоров в файле на паскале:%d", pasop);
printf("\nОператоров в новом файле:%d", cop);
printf("\nОшибок:%d", ker);
printf("\n\nРезультат:%s",s);
fclose(file1);
fclose(file2);
while (!kbhit()) ;
}
6. Распечатка тестов и результатов
Входной файл 8.pas:
var
i,k:integer;
m:char;
fl:file of char;
begin
assign(fl,'c:tuc\tuc.txt');
rewrite(fl);
Case k of
1 : Begin
write('text');
End;
2 : Begin
write('text1');
End;
3 : Begin
write(fl,'text to file');
End;
End; {End Case1}
end.
Вид экрана:
Транслят:
#include <stdio.h>
int i,k;
char m;
FILE *fl;
void main()
{
fl = fopen("c:tuc\tuc.txt","w");
fcreate(fl);
switch(k){
case 1:
{
printf("text);
break;
case 2:
{
printf("text1);
break;
case 3:
{
fprintf(fl,"text to file");
break;
} /*End Case1*/
}
Приведем пример ошибочного ввода:
Пример файла с ошибочным оператором:
var
i,k:integer;
m:char;
fl:file of char;
begin
assign(fl,'c:tuc\tuc.txt');
rewrite(fl);
Case k of
1 : Begin
write('text');
End;
2 : Begin
write('text1');
End;
3 : Begin
write(fl,'text to file');
End;
End; {End Case1}
sin(x);
end.
Вид экрана:
Транслят:
#include <stdio.h>
int i,k;
char m;
FILE *fl;
void main()
{
fl = fopen("c:tuc\tuc.txt","w");
fcreate(fl);
switch(k){
case 1:
{
printf("text);
break;
case 2:
{
printf("text1);
break;
case 3:
{
fprintf(fl,"text to file");
break;
}
/*End Case1*/
< Ошибка! >
sin(x);
Выводы
Конечно, данную программу не следует рассматривать как полноценный транслятор с языка Паскаль на Си, но её можно расширять, модифицировать и дорабатывать, что бы в конечном итоге получить полностью работоспособную версию. Тем не менее, мы приобрели полезные базовые знания и навыки построения компиляторов и трансляторов, а так же ознакомились с основными фазами анализа текстовой информации.
Список литературы
1. А.Б., К. Изучаем C++. - Санкт-Петербург: Питер, 2004.
2. Либерти Д. Освой самостоятельно C++ за 21 день. - Москва: Вильямс, 2007.
3. Саммер Г. Новые сложные задачи на C++. - Москва: Вильямс, 2005.
Размещено на Allbest.ru
Подобные документы
Выбор метода проектирования транслятора с языка Паскаль на язык Си, разработка и кодирование алгоритма программы. Использование допустимых операторов в исходном тексте, определение типов переменных и синтаксиса логических и арифметических выражений.
курсовая работа [1,0 M], добавлен 03.07.2011Программный комплекс для разработки программы транслирующей программу с языка Pascal на язык С++. Построение логической и арифметической модели решения. Разработка компилятора для программы. Методы отладки программы и создание для нее документации.
курсовая работа [742,6 K], добавлен 03.07.2011Создание приложения, исполняющего трансляцию программы из языка Паскаль в язык Си: разработка алгоритма реализации задачи, описание необходимых констант, переменных, функций и операторов, представление листинга программы и распечатка результатов.
курсовая работа [305,9 K], добавлен 03.07.2011Схема разбора арифметического и логического выражения. Внешняя спецификация конвертора и алгоритм перевода программ на языке Паскаль в текст на языке Си. Назначение подпрограмм, особенности констант и переменных. Код программы и ее тестирование.
курсовая работа [567,5 K], добавлен 03.07.2011Программирование на языке Паскаль: алфавит, решение задач, простейшие программы, разветвляющие программы, циклические программы, ввод-вывод, массивы, подпрограммы, строковые данные, записи, файлы, использование библиотеки CRT, графика в Паскале.
учебное пособие [211,1 K], добавлен 30.03.2008Составление транслятора на языке С для перевода кода программы из языка Pascal в код программы на языке Cи. Распознавание и перевод конструкций: for, type, function, integer. Вешняя спецификация, описание, структура, текст программы; распечатка текстов.
курсовая работа [287,8 K], добавлен 24.06.2011Создание программы для перевода кодов с языка Pascal на язык Си. Обработка программ операторами case, assign, rewrite и write. Способы объявления файла, комментария, переменных, логических и арифметических выражений. Виды синтаксических анализаторов.
курсовая работа [461,0 K], добавлен 03.07.2011Сущность понятия "комбинаторика". Программа формирования перестановок, сочетаний, размещений с выводом результатов на экран дисплея. Алгоритм программы, написанной на языке Паскаль. Список идентификаторов переменных программы. Список процедур программы.
лабораторная работа [19,8 K], добавлен 27.07.2010Сравнительный анализ языков программирования высокого уровня Си и Паскаль. Реализация алгоритма обработки данных. Тестирование и отладка программы или пакета программ. Структура программы на языке Турбо Паскаль. Указатели и векторные типы данных.
курсовая работа [233,5 K], добавлен 14.12.2012Совместимость и преобразование типов данных. Создание информационно-поисковой системы на языке программирования Паскаль. Описание интерфейса, каждого блока программы "Картотека больных". Рассмотрение результатов работы программы, сортирования данных.
курсовая работа [368,9 K], добавлен 18.05.2015