You are on page 1of 19

Специфікація мови PLATO

1. Вступ
Представлена тут мова програмування PLATO – імперативна мова
загального призначення.
1.1. Завдання

Розробити імперативну мову загального призначення. Обов’язковою


вимогою є:
1. дотримання синтаксичної структури оператора циклу;
2. дотримання синтаксичної структури умовного оператора
(розгалуження);
3. синтаксис операторів присвоювання, введення, виведення та
інших елементів мови пропонуються студентом;
4. семантика усіх елементів мови пропонується студентом ( у
т.ч. операторів циклу та розгалуження).
Результат виконання — специфікація мови програмування.
Специфікація містить:
1. граматику розробленої мови;
2. синтаксичні діаграми;
3. опис лексичного складу, синтаксису та семантики усіх
елементів мови;
4. приклади програмного коду розробленою мовою;
5. так званий БАЗОВИЙ ПРИКЛАД програмного коду з
використанням усіх елементів розробленої мови.

Варіант 27
Арифметика: основні чотири арифметичні операції (додавання,
віднімання, ділення та множення), піднесення до степеня
(правоасоціативна операція), дужки
Особливості: унарний мінус
Інструкція повторення: for <ід>=<вираз> to <вираз> by <вираз> while
(<відношення>) <список операторів> rof;
Інструкція розгалуження: if <відношення> {<список операторів>}

1.2. Обробка

Програма, написана мовою PLATO, подається на вхiд транслятора


(компiлятора або iнтерпретатора) для трансформацiї (перекладу,
трансляцiї) до цiльової форми (мови). Результат трансляцiї виконується
у системi часу виконання (run-time system), для чого приймає вхiднi данi
та надає результат виконання програми. Трансляцiя передбачає фази
лексичного, синтаксичного та семантичного аналiзу, а також фазу
генерацiї коду. Фази лексичного та синтаксичного аналiзу,
здiйснюються окремими проходами.

1.3. Нотація

Метасимвол Значення
= визначається як
| альтернатива
[x] 0 або 1 екземпляр х
{x} 0 або більше екземплярів х
(x | y) групування: будь-який з х або у
2xy нетермінал
zxy термінал
‘1’ термінал
“1” термінал

Табл. 1: Прийнята нотацiя РБНФ


1.4. Алфавіт

Програма може містити текст з використанням таких символів


(character) – літер, цифр, спеціальних знаків та ознаки кінця файлу.
Синтаксис
Letter = UpperCaseLetter | LowerCaseLetter.
LowerCaseLetter = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' |
'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z'.
UpperCaseLetter = 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M'
| 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z'.
Digit = '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '0'.
SpecialSign = '.' | ',' | ':' | ';' | '(' | ')' | '{' | '}' | '=' | '+' | '-' | '*' | '/' | '^' | '<' | '>' |
'!' | UnderScore | WhiteSpace | EndOfLine | EndOfFile.
UnderScore = '_'.
WhiteSpace = ' ' | '\t'.
EndOfLine = '\n' | '\r' | '\r\n' | '\n\r'.
EndOfFile = '\0'.
2. Лексика
Лексичний аналiз виконується окремим проходом, отже не залежить вiд
синтаксичного розбору та семантичного аналiзу. Лексичний аналiзатор
розбиває текст програми на лексеми. У програмi мовою PLATO можуть
використовуватись лексичнi елементи, що класифiкуються як спецiальнi
символи, iдентифiкатори, беззнаковi цiлi константи, беззнаковi дiйснi
константи, логiчнi константи та ключовi слова.
2.1. Спеціальні символи
Синтаксис
SpecialChars = ArithOp | RelOp | BracketsOp | AssignOp | Punct
ArithOp = AddOp | MultOp.
AddOp = '+' | '-'.
MultOp = '*' | '/' | '^'.
RelOp = '==' | '<=' | '<' | '>' | '>=' | '!='.
BracketsOp = '(' | ')'.
AssignOp = '='.
Punct = '.' | ',' | ':' | ';' | '{' | '}'.
Опис
До спецiальних символiв належать арифметичнi оператори,
оператори вiдношень, оператор присвоювання та знаки пунктуацiї.
Обмеження
Набiр токенiв, див. табл. 2, мiстить токени add_op та mult_op, але не
мiстить arith_op.
2.1.1. Ідентифікатори
Синтаксис
Identificator = Letter {Digit | Letter | UnderScore
Опис
Першим символом iдентифiкатора може бути тiльки лiтера,
наступнi символи, якщо вони є, можуть бути цифрами або лiтерами
або нижнє підкреслення. Довжина iдентифiкатора не обмежена.
Iдентифiкатор може позначати змiнну та програму.
Обмеження
Жоден iдентифiкатор не може збiгатись iз ключовим (вбудованим,
зарезервованим) словом або словом true, або false.
Семантика
Елемент, який у фазi лексичного аналiзу може бути визначений як
iдентифiкатор або як ключове слово, вважається ключовим словом.
Елемент, який у фазi лексичного аналiзу може бути визначений як
iдентифiкатор або як логiчна константа, вважається логiчною
константою.
Вiзуальне представлення

Приклади
c34, CHANGE_VALUE, uh, h89_78

2.2. Константи
Синтаксис
Const = IntNumber | RealNumber | BoolConst.
IntNumber = [Sign] UnsignedInt.
Real = [Sign] UnsignedReal.
Sign = '-' | '+'.
UnsignedInt = Digit {Digit}.
UnsignedReal = UnsignedInt '.' UnsignedInt.
BoolConst = true | false.
Обмеження
Кожна константа повинна мати тип, а величина константи повинна
знаходитись у дiапазонi репрезентативних значень для її типу.
На етапi лексичного аналiзу виявляються тiльки беззнаковi цiлi
константи UnsignedInt, беззнаковi дiйснi константи UnsignedReal
та логiчнi константи BoolConst.
Семантика
Кожна константа має тип, визначений її формою.
Вiзуальне представлення

Приклади
13, 0.1, 45.0, true, -457, -0.6, false
2.3. Ключові слова
Синтаксис
KeyWords = program | decl | states | integer | real | boolean | in | out
| for | to | by | while | rof | if.
2.4. Токени
З потоку символiв вхiдної програми на етапi лексичного аналiзу
виокремлюються послiдовностi символiв з певним сукупним значенням,
— токени. Списоктокенiв мови PLATO див. у табл. 2. Єдиний приклад
засвiдчує унiкальнiсть лексеми. Текст "символ . . . ", наприклад "символ
program", означає, що вказанийсимвол (symbol) є термiналом.
Код Приклади лексем Токен Неформальний опис
1 c34, uhM, h89_78 id ідентифікатор
2 34, 9, 456, intnum ціле без знаку
3 0.1, 34.98, 1.0 realnum дійсне без знаку
4 true, false boolvar логічне значення
5 program keyword символ program
6 decl keyword символ decl
7 states keyword символ states
8 integer keyword символ integer
9 real keyword символ real
10 boolean keyword символ boolean
11 in keyword символ in
12 out keyword символ out
13 for keyword символ for
14 to keyword символ to
15 by keyword символ by
16 while keyword символ while
17 rof keyword символ rof
18 if keyword символ if
19 = assign_op символ =
20 + add_op символ +
21 - add_op символ -
22 * mult_op символ *
23 / mult_op символ /
24 ^ mult_op символ ^
25 < rel_op символ <
26 <= rel_op символ <=
27 == rel_op символ ==
28 != rel_op символ !=
29 >= rel_op символ >=
30 > rel_op символ >
31 ( brackets_op символ (
32 ) brackets_op символ )
33 . punct символ .
34 , punct символ ,
35 : punct символ :
36 ; punct символ ;
37 { punct символ {
38 } punct символ }
39 /t ws пробільні символи
40 /n, /r/n eol кінець рядку
41 /0 eof кінець файлу
Табл. 2: Таблиця лексем мови PLATO
3. Типи
Мова пiдтримує значення трьох типiв: integer, real та boolean.
1. Цiлий тип integer може бути представлений оголошеною змiнною
типу integer, або константою IntNumb.
Дiапазон значень — [ -2147483648; 2147483647].
2. Дiйсний тип real може бути представлений оголошеною змiнною
типу real, або константою RealNumb.
Дiапазон значень — [3.4e−38 ; 3.4e 38 ]
3. Логiчний тип boolean може бути представлений оголошеною
змiнною типу boolean, або константою BoolConst (true або false).
Прийнято false < true.

4. Синтаксис

4.1. Вирази

Синтаксис

Expression = ArithmExpression | BoolExpression.


BoolExpression = ArithmExpression RelOp ArithmExpression.
ArithmExpression = [Sign] Terminal | ArithmExpression '+' Terminal
| ArithmExpression '-' Terminal.
Terminal = Factor | Terminal '*' Factor | Terminal '/' Factor
| Factor '^' Terminal.
Factor = Ident | Const | '(' ArithmExpression ')'.
Опис
Вираз - це послiдовнiсть операторiв i операндiв, що визначає
порядок обчислення значення.
Розрiзняються арифметичнi та логiчнi вирази.
Значення, обчислене за арифметичним виразом, має тип real або
integer.
Значення, обчислене за логiчним виразом, має тип boolean.
Всi бiнарнi оператори у виразах цiєї мови лiвоасоцiативнi, окрім
піднесення до степеня, яке в свою чергу є правоасоціативні.
Найвищий прiоритет в унарного мiнуса та унарного плюса, далi, у
порядку зменшення прiоритету слiдують MultOp, AddOp та RelOp.
Послiдовнiсть двох або бiльше операторiв з однаковим
прiоритетом асоцiативна.
Обмеження
Тип кожної змiнної має бути визначений у роздiлi оголошень.
Повторне оголошеної змiнної викликає помилку на етапi (у фазi)
трансляцiї.
Використання неоголошеної змiнної, викликає помилку на етапi
трансляцiї.
Використання змiнної, що не набула значення, викликає помилку
на фазі трансляції та під час виконання.
Семантика
Кожна константа має тип, визначений її формою та значенням.
Змiнна набуває значення в iнструкцiї присвоювання Assign або в
iнструкцiї введення Inp.

Вiзуальне представлення

\
Приклади
Factor: x, 12, (a + 234)
Terminal: m*z, 32/(b + 786)
ArithmExpr: -b, f1 + g, c – 24, f6^4
BoolExpr: -b == 2, (a*x + b/z) >= (k + t)

4.2. Оператори

4.2.1. Арифметичні оператори

Синтаксис
AddOp = '+' | '-'.
MultOp = '*' | '/' | '^'.
Семантика
Тип результату при застосуваннi бiнарних операторiв див. табл. 3.
Тип результату при застосуваннi унарних операторiв див. табл. 4.
Дiлення на нуль викликає помилку.
Приклад
1.234*x1/45.67, -3.4+6, 7/8, 12^5
Операто Операція Типи операндів Тип результату
р
+ додавання integer або real real,
- віднімання integer або real якщо хоча б один з
* множення integer або real операндів – real,
^ піднесення до степеню integer або real integer
/ ділення integer або real real

Табл. 3: Бiнарнi арифметичнi оператори


Операто Операція Типи операндів Тип результату
р
- зміна знаку ineger integer
real real
+ ідентичності Integer Integer
real real

Табл. 4: Унарні арифметичні оператори

4.2.2. Оператори відношення

Синтаксис
RelOp = '==' | '<=' | '<' | '>' | '>=' | '!='.

Обмеження
Значення обох операндiв мають бути або числовими (типу integer
або real), або логiчними (типу boolean).
Результат завжди має тип boolean.

Семантика
Якщо один з операндiв має тип integer, а iнший — real, то значення
типу integer приводиться до типу real.
Приклади

x1+3 < 1, 0.5*2.34 <= 15 ^ 7, (z-3>0) != (2>=m), true > false

5. Оголошення
Синтаксис
Declsection = decl '{' DeclareList '}'.
DeclareLlist = { Declaration ';' }.
Declaration = Type Identificator.
Type = integer | real | boolean.
Опис
Оголошення (декларацiя) специфiкує набiр iдентифiкаторiв, якi
можуть бути використанi у програмi.
Оголошення iдентифiкатор означає оголошення змiнної.
Обмеження
Роздiл оголошень знаходиться перед роздiлом iнструкцiй.
Кожен iдентифiкатор має бути оголошений i тiльки один раз.
Семантика
Оголошення змiнної означає видiлення пам’ятi для зберiгання
значення декларованого типу.
Значення оголошеної змiнної залишається невизначеним аж до
присвоєння їй значення у iнструкцiї присвоєння або введення.
Область видимостi змiнної (scope) — вся програма.
Вiзуальне представлення
Приклад
decl {
integer a;
boolean J;
real u_g8host;
}

6. Розділ інструкцій
Синтаксис
Statesection ='{' StatementsList '}'.
StatementsList = Statement ';' {Statement ';'}
Statement = Assign | In | Out | ForStatement | IfStatement
Опис
Iнструкцiї (statements) визначають алгоритмiчнi дiї, якi мають бути
виконанi у програмi.
Обмеження
У роздiлi iнструкцiй має бути не менше однiєї iнструкцiї.
Семантика
Iнструкцiї виконуюються послiдовно у порядку запису (оскiльки
мова не мiстить операторiв перехду).
Вiзуальне представлення
Приклад
states {
a = 7;
u_g8host = a / 3;
}
6.1. Оператор (iнструкцiя) присвоювання
Синтаксис
Assign = Identificator AssignOp Expression.
Опис
Значення, якi можуть використовуватись у лiвiй та правiй
частинах iнструкцiї присвоювання називають l-значенням та r-
значенням (або lvalue та rvalue, або left-value та right-value).
Обмеження
Тип змiнної з iдентифiкатором Identificator повинен збiгатись з
типом r-значення.
Семантика
l-значення має тип вказiвника на мiсце зберiгання значення
змiнної з iдентифiкатором Ident.
r-значення має тип значення, обчисленого за виразом Expression.
Вiзуальне представлення

Приклад
f5 = 3/4+1.23, b7 = 2+3 < 7 ^ 5
6.2. Iнструкцiя введення
Синтаксис
In = in '(' Identificator {',' Identificator} ')'.
Опис
Значення вводяться з клавiатури.
Введення кожного окремого значення пiдтверджується клавiшею
Enter.
Обмеження
Вiдмiннiсть типу введеного значення вiд типу змiнної викликає
помилку.
Вiзуальне представлення

Приклад
in(a1,v2,len7) .
6.3. Iнструкцiя виведення
Синтаксис
Out = out '(' Identificator {',' Identificator} ')'.
Опис
Всi значення списку виводяться у один рядок консолi.
Кожне значення виводиться у форматi \tIdent=значення.
Обмеження
Виведення змiнної з невизначеним значенням викликає помилку.
Вiзуальне представлення
Синтаксичну дiаграму див. на рис. 1.
Приклад
out(c,x1,f5)
Рис. 1: Iнструкцiя виведення
6.4. Оператор циклу (iнструкцiя повторення)
Синтаксис
ForStatement = for ForAssign to Last by Step while '(' Condition ')'
OpList rof ';'.
ForAssign = Id AssignOp Start.
Id = NumberType Identificator.
NumberType = integer | real.
Condition = BoolExpression.
Start = ArithmExpression.
Last = ArithmExpression.
Step = ArithmExpression.
Опис
Тiло оператора циклу OpList виконується один або бiльше разiв..
Семантика
Перед першою ітерацією Id присвоюється значення Start, перед
наступними ітерацією виконується Id = Id + Step.
Перевіряється умова Id < Last. Якщо умова не виконується, то
цикл завершується.
Перевіряється Condition. Якщо умова не виконується, то цикл
завершується.
Виконується OpList.
Вiзуальне представлення
Приклад
for real i = 0.1 to 0.9 by 0.1 while ((i + 1.2) 2 != 1 ) {
out(i);
}
6.5. Оператор розгалудження
Синтаксис
IfStatement = if Condition OpList.
Опис
Тіло оператору OpList виконується 0 або 1 раз.
Обмеження
Значення Condition має тип boolean,
Семантика
OpList виконується, якщо значення Condition визначається як true.
Вiзуальне представлення
Синтаксичнi дiаграми див. на рис. 8.

Рис. 7: Оператор циклу


Приклад
If a < 3 {
out(3);
}

7. Програма
Синтаксис
Program = program ProgName '{' Declsection Statesection '}'.
ProgName = Identificator
Опис
Кожна програма починається з термiнала program, iдентифiкатора
програми символа '{'; за iдентифiкатором програми — (єдиний)
роздiл оголошень; далi — (єдиний) роздiл iнструкцiй. Програма
закінчується символом '}'.
Iдентифiкатор програми нiяк не використовується у програмi.
Вiзуальне представлення
Синтаксичну дiаграму див. на рис. 9.
Приклад
program Counter {
decl {
integer a;
integer b;
real g;
}
states {
in(g);
for integer i = 0 to 11 by 1 while (i != 5) {
if(i < 5) {
a = (-i);
}
If(I > 5) {
a = i;
}
b = b + a ^ g ^ (a * g);
}
out(b);
}
}

8. Повна граматика мови MP


Program = program ProgName '{' Declsection Statesection '}'.
ProgName = Identificator.
Identificator = Letter {Digit | Letter | UnderScore}.
Declsection = decl '{' DeclareList '}'.
DeclareList = {Declaration ';'}.
Declaration = Type Identificator.
Type = integer | real | boolean.
Statesection = states '{' StatementsList '}'.
StatementsList = Statement ';' {Statement ';'}.
Statement = Assign | In | Out | ForStatement | IfStatement.
Assign = Identificator AssignOp Expression.
In = in '(' Identificator {',' Identificator} ')'.
Out = out '(' Identificator {',' Identificator} ')'.
ForStatement = for ForAssign to Last by Step while '(' Condition ')' OpList rof ';'.
ForAssign = Id AssignOp Start.
Id = NumberType Identificator.
NumberType = integer | real.
Condition = BoolExpression.
Start = ArithmExpression.
Last = ArithmExpression.
Step = ArithmExpression.
OpList = StatementsList.
IfStatement = if Condition OpList.
Expression = ArithmExpression | BoolExpression.
BoolExpression = ArithmExpression RelOp ArithmExpression.
ArithmExpression = [Sign] Terminal | ArithmExpression '+' Terminal |
ArithmExpression '-' Terminal.
Terminal = Factor | Terminal '*' Factor | Terminal '/' Factor | Factor '^' Terminal.
Factor = Ident | Const | '(' ArithmExpression ')'.
KeyWords = program | decl | states | integer | real | boolean | in | out | for | to | by
| while | rof | if.
Const = IntNumber | RealNumber | BoolConst.
IntNumber = [Sign] UnsignedInt.
Sign = '-' | '+'.
RealNumber = [Sign] UnsignedReal.
UnsignedInt = Digit {Digit}.
UnsignedReal = UnsignedInt '.' UnsignedInt.
BoolConst = true | false.
SpecialChars = ArithOp | RelOp | BracketsOp | AssignOp | Punct.
ArithOp = AddOp | MultOp.
AddOp = '+' | '-'.
MultOp = '*' | '/' | '^'.
RelOp = '==' | '<=' | '<' | '>' | '>=' | '!='.
BracketsOp = '(' | ')'.
AssignOp = '='.
Punct = '.' | ',' | ':' | ';' | '{' | '}'.
Letter = UpperCaseLetter | LowerCaseLetter.
LowerCaseLetter = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' |
'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z'.
UpperCaseLetter = 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' |
'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z'.
Digit = '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '0'.
SpecialSign = '.' | ',' | ':' | ';' | '(' | ')' | '{' | '}' | '=' | '+' | '-' | '*' | '/' | '^' | '<' | '>' | '!' |
UnderScore | WhiteSpace | EndOfLine | EndOfFile.
UnderScore = '_'.
WhiteSpace = ' ' | '\t'.
EndOfLine = '\n' | '\r' | '\r\n' | '\n\r'.
EndOfFile = '\0'.

You might also like