Сторінка
3

Паскаль: мова та метамова

<оператори-розгалуження> ::=

if <умова> then <оператор> else <оператор> |

if <умова> then <оператор> – правило

<оператори-розгалуження> ::=

if <умова> then <оператор> [ else <оператор> ] Іноді буває зручно позбутися якогось поняття, замінивши його нетермінал відповідним метавиразом, наприклад, замість нетермінала <первинне> з прикладу 10.2 записати метавиразом <стала> | <ім'я> або навіть '1' | '2' | 'x' | 'y' | 'z'. Таким чином, сукупність БНФ із прикладу 10.2 еквівалентна сукупності <оператор присвоювання> ::=

<ім'я> ':=' ('1' | '2' | <ім'я>) [ ('+'| '-') ('1' | '2' | <ім'я>) ] <ім'я> ::= 'x' | 'y' | 'z' Зміст метасимволів "{", "}" означимо за допомогою такого прикладу. Приклад 3. Ім'я, або ідентифікатор, у мовах програмування – це послідовність букв і цифр, що починається з букви. Нехай буквами є лише A, B, C, цифрами – 0 і 1. Ідентифікаторами в цьому алфавіті є, наприклад, A, B1, BC, C1CAAB0 тощо. Означимо сукупність БНФ, що задає їх синтаксис. Розглядаючи поняття "ідентифікатор", можна ввести поняття "послідовність букв і цифр, можливо, порожня". Позначимо ці два поняття відповідно нетерміналами <Ід> і <ПБЦ>. Введемо також поняття "буква" й "цифра" (нетермінали <Б> і <Ц>). Послідовність букв і цифр або порожня, або починається буквою або цифрою, за якою записано послідовність букв і цифр. Іншими словами, <Ід> ::= <Б><ПБЦ> <Б> ::= 'A' | 'B' | 'C' <Ц> ::= '0' | '1' <ПБЦ> ::= <> | (<Б> | <Ц>) <ПБЦ>. Узагальнимо букви й цифри поняттям "символ", додавши правило <символ> ::= <Б> | <Ц>. Тоді <ПБЦ> можна задати двома правилами: <ПБЦ> ::= <> | <символ> <ПБЦ>. За допомогою цих правил із нетермінала <ПБЦ> виводяться всі можливі послідовності символів: <>, <символ>, <символ><символ>, … , і тільки вони. Позначимо множину послідовностей, складених із <символ>, метавиразом {<символ>} із новими метасимволами "{", "}". Вважатимемо, що всі послідовності символів вивідні з цього метавиразу. Отже, правило <ПБЦ> ::= {<символ>} за нашим означенням є еквівалентним правилам <ПБЦ> ::= <> | <символ> <ПБЦ>. Взагалі, якщо X – довільний метавираз, то метавираз {X} позначає всі послідовності (у тому числі порожню) виразів, вивідних із X. Дужки {} називаються ітераційними. З їх використанням поняття ідентифікатора з останнього прикладу можна задати так: <Ід> ::=<Б> { <Б> | <Ц> } <Б> ::= 'A' | 'B' | 'C' <Ц> ::= '0' | '1' або навіть так: <Ід> ::=( 'A' | 'B' | 'C' ){ 'A' | 'B' | 'C' | '0' | '1' }. Приклад 4. У мовах програмування широко використовується поняття "список імен, розділених комами". Структуру таких списків можна задати РБНФ <список імен> ::= <ім'я>{','<ім'я>}. Означення змінних у Паскаль-програмі складається з довільного числа списків змінних, за якими після двокрапки записано ім'я типу та ';'. Списків з іменами типів може взагалі не бути. Будь-якому зі списків може передувати слово var (перед першим воно обов'язкове). Це слово відокремлюється від імені хоча б одним пропуском. Якщо обмежитися типами integer та real, то синтаксис означення змінних можна задати РБНФ

<означення змінних> ::= [ 'var '<список імен> ':' <ім'я типу> ';'

{ ['var ']<список імен>':'<ім'я типу>';' }

]

<ім'я типу> ::= 'integer' | 'boolean' Оператори мови Паскаль, на відміну від означень, не закінчуються роздільником ';', і синтаксис непорожньої послідовності операторів задається РБНФ <послід. операторів> ::= <оператор> {';' <оператор>} Приклад 5. Розглянемо вирази з цілими сталими, в яких можуть бути виклики одномісної функції odd. Виразом є ціла стала, а також:

1. вираз у дужках,

2. два вирази й знак бінарної операції між ними,

3. вираз із знаком унарної операції на початку,

4. виклик функції odd із виразом у дужках. Ці неформальні, але однозначні правила легко перекладаються на мову БНФ. Нехай <E> позначає вираз (англійське Expression), <C> – сталу (Constant), <BinOp> – знак бінарної (двомісної) операції (Binary Operation Sign), <UnOp> – знак унарної (одномісної) операції (Unary Operation Sign), <FN> – ім'я функції (Function Name). Тоді <E> ::= <C> | '('<E>')' | <E><BinOp><E> | <UnOp><E> | <FN>'('<E>')' <C> ::= <Ц>{<Ц>} (уточнення інших нетерміналів залишається читачеві, ).

4. Синтаксичні діаграми Мова форм Бекуса-Наура – не єдина метамова для описання структури конструкцій мов програмування. Досить поширеною є також метамова синтаксичних діаграм. В основі цієї метамови також лежать нетермінальні й термінальні символи. Але тут вони записуються у прямокутниках та колах (овалах) відповідно. Наприклад, нетермінали <A> та <оператор> позначаються так: Відповідно термінальні символи '(' та else мають вигляд Порядок символів у метавиразах задається стрілками, наприклад: Альтернативні метавирази задаються розгалуженням стрілок. Наприклад, якщо E1, E2 – метавирази, то E1 | E2 має такий вигляд: Можливість присутності або відсутності якоїсь частини виразу задається аналогічно, тільки одна з альтернатив порожня. Наприклад, структура операторів розгалуження задається так: Фігурним дужкам {E}, які задають повторення, відповідає повернення стрілки на початок діаграми, відповідної E. Наприклад, структура непорожньої послідовності операторів задається метавиразом <оператор> { ';' <оператор>}, якому відповідає діаграма Нарешті, поняття, вказане у БНФ ліворуч від знака "::=" нетерміналом, наприклад, A, записується також ліворуч від діаграми:

Перейти на сторінку номер:
 1  2  3 


Інші реферати на тему «Інформатика»: