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

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

Специфікація мови 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] {x} (x | y) 2xy zxy ‘1’ “1”

Значення визначається як альтернатива 0 або 1 екземпляр х 0 або більше екземплярів х групування: будь-який з х або у нетермінал термінал термінал термінал Табл. 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

Приклади лексем Токен Неформальний опис c34, uhM, h89_78 id ідентифікатор 34, 9, 456, intnum ціле без знаку 0.1, 34.98, 1.0 realnum дійсне без знаку true, false boolvar логічне значення program keyword символ program decl keyword символ decl states keyword символ states integer keyword символ integer real keyword символ real boolean keyword символ boolean in keyword символ in out keyword символ out for keyword символ for to keyword символ to by keyword символ by while keyword символ while rof keyword символ rof if keyword символ if = assign_op символ = + add_op символ + add_op символ * mult_op символ * / mult_op символ / ^ mult_op символ ^ < rel_op символ < = > rel_op символ > ( brackets_op символ ( ) brackets_op символ ) . punct символ . , punct символ , : punct символ : ; punct символ ; { punct символ { } punct символ } /t ws пробільні символи /n, /r/n eol кінець рядку /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зуальне представлення

\

Приклади

4.2.

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.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 integer або real integer або real integer або real integer або real

real, якщо хоча б один з операндів – real, integer real

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

Операція

Типи операндів

Тип результату

-

зміна знаку

+

ідентичності

ineger real Integer real

integer real Integer 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 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'.