Курсовая Методы трансляци
Работа добавлена на сайт bukvasha.net: 2015-10-25Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
от 25%
договор
Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Южно-Уральский государственный университет
Кафедра «Прикладная математика»
Курсовая работа
по дисциплине «Методы трансляции»
Выполнил : Наумченкова Е.
Специальность: 230105
Группа: ММз – 307
Проверил: доцент кафедры Прикладной математики ЮурГУ
Демидов Андрей Константинович
Челябинск – 2010
СОДЕРЖАНИЕ
1. Постановка задачи………………………………………………………….3
2. Лексический блок………………………………………………………….5
3. Грамматический блок……………………………………………………....7
4. Пример работы транслятора ……………………………………………....9
Список использованной литературы
1 Постановка задачи
Транслятор должен переводить указанный язык на подмножество языка Си
goto label;
if(переменная) goto label;
переменная=[переменная] операция переменная;
переменная [операция]=переменная;
scanf("%d",&mem[число]);
printf("%d",mem[число]);
printf("строка");
Где переменная: stack[top] или stack[top-число] или top или mem[число] или число
В результате должен получиться файл program.c:
#include <stdio.h>
int main()
{
int stack[1000],mem[1000],top=0;
/* код программы */
}
***********************
A2 B1 C4 F1 G4 H2
***********************
A. Комментарии:
2. // текст до конца строки
B. Числа целые десятичные и
1. Восьмеричные, начинающиеся с префикса 0
C. Строки (для вывода)
4. [текст] [текст в [\] ]
D. Переменные - идентификатор, начин с буквы, затем буквы и цифры,
длиной до 10 символов
E. Выражения
Операции +, -, *, / и знаки сравнения >, <, =, !=, >=, <=,
круглые скобки, операция смена знака -, обычный приоритет
F. Оператор присваивания
1. Переменная:=Выражение
G. Операторы ввода-вывода
4. GET IN переменная
GET OUT строка
GET OUT переменная
H. Сложные операторы
2. Операторы разделяются концом строки
IF выражение THEN
операторы
ENDIF
IF выражение THEN
операторы
ELSE
операторы
ENDIF
WHILE выражение
операторы
WEND
2 Лексический блок
Инструмент flex использует конфигурационный файл для создания исходного кода на C. Конфигурационный файл определяет набор символов, ожидающихся в анализируемом файле, а также действия, которые надо выполнить, когда файл будет проанализирован.
Содержание файла c.lex:
%{
#include "y.tab.h"
#include "util.h"
extern int yylval;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int nlines=1;
%}
%%
"//".*\n nlines++;
0[0-7]* {sscanf(yytext,"%o",&yylval);return NUMBER;}
[0-9]+ {sscanf(yytext,"%d",&yylval);return NUMBER;}
\[(\\.|[^\]\n])*\] {
char *s;
int n,k=0,i;
n=strlen(yytext);
s=malloc(n * 2 + 1);
s[k++]='"';
for(i=1;i<n-1;i++)
{
if(yytext[i]=='"')
{s[k++]='\\'; s[k++]='"';}
else if(yytext[i]=='\\')
{s[k++]='\\'; s[k++]=yytext[++i];}
else s[k++]=yytext[i];
}
s[k++]='"';
s[k++]='\0';
yylval=(int)s;
return STRING;
}
":=" return ASSIGN;
"!=" return NE;
"<=" return LE;
">=" return GE;
GET return GET;
IN return IN;
OUT return OUT;
IF return IF;
THEN return THEN;
ENDIF return ENDIF;
ELSE return ELSE;
WHILE return WHILE;
WEND return WEND;
[ \t] ;
[A-Za-z][A-Za-z0-9]* {yylval=findid(yytext); return IDENT;}
\n { nlines++; return yytext[0];}
. return yytext[0];
%%
int yywrap(){return 1;}
3 Грамматический блок
Задачей анализатора Bison является сборка лексем в группы в соответствии с правилами грамматики. По мере выполнения этой задачи анализатор выполняет действия, сопоставленные используемым правилам грамматики. На вход подается файл грамматики Bison. Выходным текстом является исходный текст на C, осуществляющий разбор языка, описываемого грамматикой.
c.grm:
%start PROGRAM
%token ASSIGN NE LE GE NUMBER STRING IDENT
%token GET IN OUT ENDIF WEND IF ELSE WHILE THEN
%nonassoc '=' NE LE GE '<' '>'
%left '+' '-'
%left '*' '/'
%left UMINUS
%{
#include <stdio.h>
#include <string.h>
int root;
extern int nlines;
%}
%%
PROGRAM: operators
{ root=$1; }
;
operators: operator
{ $$=$1; }
| operators operator
{ $$=seq($1,$2); }
;
elsepart :
{ $$=emptystmt(); }
| ELSE '\n' operators
{ $$=$3; }
;
operator: '\n'
{ $$=emptystmt(); }
| IDENT ASSIGN expression '\n'
{ $$ = assignstmt($1, $3); }
| GET OUT STRING '\n'
{ $$ = printstr($3); }
| GET OUT expression '\n'
{$$ = printint($3); }
| GET IN IDENT '\n'
{$$ = scanvar($3); }
| IF expression THEN '\n' operators elsepart ENDIF '\n'
{ $$ = ifstmt($2, $5, $6); }
| WHILE expression operators WEND '\n'
{ $$ = whilestmt($2, $3); }
;
expression: expression '=' expression { $$ = $3; }
| expression NE expression { $$ = ne($1, $3); }
| expression '<' expression { $$ = lt($1, $3); }
| expression LE expression { $$ = le($1, $3); }
| expression '>' expression { $$ = gt($1, $3); }
| expression GE expression { $$ = ge($1, $3); }
| expression '+' expression { $$ = plus($1, $3); }
| expression '-' expression { $$ = minus($1, $3); }
| expression '*' expression { $$ = mult($1, $3); }
| expression '/' expression { $$ = divide ($1, $3); }
| '-' expression %prec UMINUS
{ $$ = neg($2); }
| '(' expression ')' { $$ = $2; }
| NUMBER { $$ = number($1); }
| IDENT { $$ = ident($1); }
;
%%
int yyerror(char *msg)
{
printf("Line %d: %s\n",nlines,msg);
exit(1);
}
int main(int argc, char *argv[])
{
if(argc>1)
freopen(argv[1],"r",stdin);
if(argc>2)
freopen(argv[2],"w",stdout);
yyparse();
printf(
"#include <stdio.h>\n"
"int main()\n"
"{\n"
" int stack[1000],mem[1000],top=0;\n");
generate(root);
printf(" ;\n}\n");
return 0;
}
4 Пример работы транслятора
Задача: найти наибольший общий делитель, сократить дробь.
Текст программы на входном языке находится в файле test2.prg:
GET OUT [Sokraschenie drobei\n]
GET OUT [Vvedite chislitel']
GET IN chisl
GET OUT [Vvedite znamenatel']
GET IN znam
M:=chisl
N:=znam
IF M>=N THEN
R:=M-N
ELSE
R:=N-M
ENDIF
WHILE R>0
IF N>=M THEN
N:=N-M
ELSE
M:=M-N
ENDIF
IF M>=N THEN
R:=M-N
ELSE
R:=N-M
ENDIF
WEND
chisl:=chisl/M
znam:=znam/M
GET OUT [NOD=]
GET OUT M
GET OUT [\ndrob' \n]
GET OUT chisl
GET OUT [\\]
GET OUT znam
Обработка транслятором:
Compiler test.prg >test2.c
Программа на выходном языке (подмножество языка С) test.c :
#include <stdio.h>
int main()
{
int stack[1000],mem[1000],top=0;
printf("Sokraschenie drobei\n");
printf("Vvedite chislitel'");
scanf("%d",&mem[0]);
printf("Vvedite znamenatel'");
scanf("%d",&mem[1]);
stack[top]=mem[0];
top+=1;
top-=1;
mem[2]=stack[top];
stack[top]=mem[1];
top+=1;
top-=1;
mem[3]=stack[top];
stack[top]=mem[2];
top+=1;
stack[top]=mem[3];
top+=1;
top-=1;
stack[top-1]=stack[top-1]>=stack[top];
top-=1;
if(stack[top]) goto label0;
stack[top]=mem[3];
top+=1;
stack[top]=mem[2];
top+=1;
top-=1;
stack[top-1]-=stack[top];
top-=1;
mem[4]=stack[top];
goto label1;
label0:
stack[top]=mem[2];
top+=1;
stack[top]=mem[3];
top+=1;
top-=1;
stack[top-1]-=stack[top];
top-=1;
mem[4]=stack[top];
label1:
label3:
stack[top]=mem[4];
top+=1;
stack[top]=0;
top+=1;
top-=1;
stack[top-1]=stack[top-1]>stack[top];
top-=1;
stack[top]=!stack[top];
if(stack[top]) goto label2;
stack[top]=mem[3];
top+=1;
stack[top]=mem[2];
top+=1;
top-=1;
stack[top-1]=stack[top-1]>=stack[top];
top-=1;
if(stack[top]) goto label4;
stack[top]=mem[2];
top+=1;
stack[top]=mem[3];
top+=1;
top-=1;
stack[top-1]-=stack[top];
top-=1;
mem[2]=stack[top];
goto label5;
label4:
stack[top]=mem[3];
top+=1;
stack[top]=mem[2];
top+=1;
top-=1;
stack[top-1]-=stack[top];
top-=1;
mem[3]=stack[top];
label5:
stack[top]=mem[2];
top+=1;
stack[top]=mem[3];
top+=1;
top-=1;
stack[top-1]=stack[top-1]>=stack[top];
top-=1;
if(stack[top]) goto label6;
stack[top]=mem[3];
top+=1;
stack[top]=mem[2];
top+=1;
top-=1;
stack[top-1]-=stack[top];
top-=1;
mem[4]=stack[top];
goto label7;
label6:
stack[top]=mem[2];
top+=1;
stack[top]=mem[3];
top+=1;
top-=1;
stack[top-1]-=stack[top];
top-=1;
mem[4]=stack[top];
label7:
goto label3;
label2:
stack[top]=mem[0];
top+=1;
stack[top]=mem[2];
top+=1;
top-=1;
stack[top-1]/=stack[top];
top-=1;
mem[0]=stack[top];
stack[top]=mem[1];
top+=1;
stack[top]=mem[2];
top+=1;
top-=1;
stack[top-1]/=stack[top];
top-=1;
mem[1]=stack[top];
printf("NOD=");
stack[top]=mem[2];
top+=1;
top-=1;
printf("%d",stack[top]);
printf("\ndrob' \n");
stack[top]=mem[0];
top+=1;
top-=1;
printf("%d",stack[top]);
printf("\\");
stack[top]=mem[1];
top+=1;
top-=1;
printf("%d",stack[top]);
return 0;
}
Результат работы:
Список литературы
1. Гордеев А. В., Молчанов А. Ю. Системное программное обеспечение. – СПб.: издательство «Питер», 2001. – 736 с.
2. Доннелли Чарльз, Столлмен Ричард. Bison. – http://www.opennet.ru/docs/RUS/bison_yacc/bison_toc.html
3. Мартин Браун. Создание анализаторов текста при помощи yacc и lex. –http://www.ibm.com/developerworks/ru/edu/au-lexyacc/index.html
4. Свердлов С. Введение в методы трансляции: учебное пособие. – Вологда: издательство «Русь», 1994. – 80с.
5. Свердлов С. З. Языки программирования и методы трансляции: учебное пособие. – СПб.: издательство «Питер», 2007. – 640с.