Содержание
Содержание. 2
1. Цель работы. 3
2. Краткое описание учебного языка, варианты заданий. 3
3. Расшифровка цифр варианта задания. 3
4. Пример праграммы.. 4
5. Регулярные выражения. 6
6. Построить КА в форме матрицы: 6
7. Формальная грамматика. 7
8. Примеры результатов работы.. 8
Результат реализации лексического блока. 8
Результат реализации синтаксичекого блока. 9
Результат реализации генератора кода с переводом в язык абстрактной стековой машины.. 14
9. Список литературы.. 15
Цель работы.
Практическое применение теоретических основ проектирования трансляторов с языков программирования; освоение средств автоматизации построения трансляторов; разработка элементов транслятора для учебного языка.
2. Краткое описание учебного языка, варианты заданий.
Лексика, синтаксис и семантика учебного языка основаны на языках типа Java и C#.
Ключевые слова (выделены жирным шрифтом, например: число, строка, данные, …) должны быть нечувствительны к регистру. Обозначения:
[ ] – необязательная часть
… – часть, повторяющаяся произвольное количество раз
< > – описание конструкции
<Б>|<Ц>|<пБ>|<пЦ>|<пБЦ> – буква | цифра | последовательность букв | последовательность цифр | последовательность букв и/или цифр или пусто
<И> – <имя объекта>
<В> – <выражение>
<ЛВ> – <ЛогическоеВыражение>
<ОБ> – <ОператорИлиБлок> (<О> - одиночный оператор)
<К> –<константа>
3. Расшифровка цифр варианта задания.
a). Идентификаторы и константы:
Вариант: | |
Идентификаторы | <пБ><Ц> |
Константы | целые вещественные символьные 5-ричные yes/ no |
b. Объявления примитивных типов (целое, вещественное, символьное, булево):
|
Вариант: | |
int[e[g[e[r]]]] float char bool |
c. Оператор присваивания:
Вариант: | |
<И> = <В>; |
d. Условный оператор:
Вариант: | |
by <ЛВ> do <ОБ> [otherwise <ОБ>] |
e. Переключатель:
Вариант: | |
switch<В> {by <К>:<ОБ> …} |
f.Оператор цикла:
Вариант: | |
for<И>from<К>to<К> [step<К>] <ОБ> |
Пример праграммы
int ab2, d3; float c1;
bool xy4;
by(xy4==yes) do ab2 = 4;
otherwise c1=3;
switch (ab2) { by 1: d3=4 * (c1 + 3); by 2: c1 =(ab2 + 3) *3; }
for d3 from 0 to 3 ab2 = d3 * 1;
Интерпретация программы в код абстрактной стековой машины:
1)
int ab2, d3;
float c1;
bool xy4;
ab2 DW
d3 DW
c1 DD
xy4 DB
2)
switch (ab2)
{
by 1: d3= (c1 + 3)*4;
by 2: c1 =(ab2 + 3) *3;
}
RVALUE ab2
PUSH 1
=
GOTRUE CASE2
RVALUE ab2
PUSH 2
=
GOTRUE CASE1
GOTO OUT_SWITCH
LABEL CASE2
LVALUE d3
PUSH 4
RVALUE c1
PUSH 3
ADD
MULT
:=
GOTO OUT_SWITCH
LABEL CASE 1
LVALUE c1
RVALUE ab2
PUSH 3
ADD
PUSH 3
MULT
:=
GOTO OUT_SWITCH
LABEL OUT_SWITCH
3. by(xy4==yes) ab2 = 4; otherwise c1=3;
RVALUE xy4
PUSH yes
==
GOTRUE M1
GOTO M2
LABEL M2
LVALUE c1
PUSH 3
:=
GOTO M3
LABEL M1
LVALUE ab2
PUSH 4
:=
GOTO M3
LABEL M3
4)
for d3 from 0 to 3 ab2 = d3 + 1;
LVALUE d3
PUSH 0
:=
LABEL LAP
RVALUE d3
PUSH 3
<=
GOFALSE OUTFOR
LVALUE ab2
RVALUE d3
PUSH 1
MULT
:=
LVALUE
d3
RVALUE
d3
PUSH 1
ADD
:=
GOTO LAP
LABEL OUTFOR
Регулярные выражения
<И>:= < пБ><Ц>
<Буква>:=a|b|c...|x|y|z
< пБ>:=(буква)*
<Ц>:=0|1|2|3
<пЦ >:=(ц)*
<drop>:=.< пЦ >|e
<К>:=<знак>< пЦ ><drop>
<Знак >:=+|-|e
<Операнд>:=<ид>|< K>
<Сравнение>:= >|<|>=|<=|==|!=
<var>:=int | float|char|bool|
<by>:=by
<do>:=do
<othewise >:= othewise
<switch>:=switch
<for>:=for
<from>:=from
<to>:=to
<step>:=step
<oper>:=+|*|/|-
6. Построить КА в форме матрицы:
Входные символы: {var,id, by, crav,do, const, op,;,=, othewise, switch, (,), {, },:, for, from, to,step,+,*}
|
Состояния автомата:
· S0 – Поступление “var”
· S1 - Поступление “id”
· S2 - Поступление “, ”
· S3 - Поступление “;”
· S4 - Поступление ключевого слова “by”
· S5 - Поступление “crav”
· S6 - Поступление ключевого слова “do”
· S7 - Поступление “=”
· S8 - Поступление “(”
· S9 - Поступление “)”
· S10 - Поступление “+”
· S11 - Поступление “*”
· S12 - Поступление ключевого слова “otherwise”
· S13 - Поступление “{”
· S14 - Поступление “}”
· S15 - Поступление “const”
· S16 - Поступление “:”
· S17 - Поступление ключевого слова “for ”
· S18- Поступление ключевого слова “from”
· S19- Поступление ключевого слова “to ”
· S20 - Поступление ключевого слова “step”
· S21 - Поступление ключевого слова “switch ”
Построение КА в форме матрицы для описания лексического блока
Формальная грамматика
T={ var,id, by, crav,do, const,;,=, othewise, switch, (,), {, },:, for, from, to,step,+,*}
P: V={Prog, telo, varop, ID, ifop, switchop, byop, forop, block, operand,B,opmult,som}
V 0 = <Prog>
1) <Prog> -> <varop><telo>
2)<telo> -> <condop><telo>
-><forop><telo>
-><switchop><telo>
->e
3)<varop> -> var <ID>;
->var <ID>; <varop>
4)<ID> -> id | id, <ID>
5)condop -> by (operan crav operan) do <block>
->by (operan crav operan) do <block> otherwise <block>
6)Switchop -> switch (B) {<byop>}
Byop -> by const: <block>
-> by const: <block> <byop>
7)Forop -> for id from const to const <block>| for id from const to const step const <block>
8)<Block> -> id = <B>;
->id = <B>; <block>
9)<В> -> <В> <операция сложения> < оператор умножения>
-> <оператор умножения>
10)<оператор умножения>
-> <оператор умножения> <операция умножения> < сомножитель>
-> <оператор умножения> –> <сомножитель>
11)<сомножитель> -> (<В>)
|
-> <операнд>
Примеры результатов работы