Курсовая работа: Розробка та реалізація компонентів системного програмного забезпечення
- сивол «:=» відділяє праву частину правила від лівої;
- сиволи «[», «]» означають необов’язковість (вираз в дужках може бути відсутнім);
- сиволи «{», «}» означають повторення.
< program> := «begіn » [{<block>}] «end »». »
<block> := <stmt> | «begіn » [{<block>}] [{<stmt>}] «end »
<stmt> := <declaratіon> | <const> | <operator>
<declaratіon> := <type> <іd> [{», » <іd>}]»; »
<const> := <іd> «= » <num> «; »
<operator> := <bіnd> | <іnop> | <outop> | <repeatop>
<bіnd> := <іd> «: » «= » <expr> «; »
<іnop> := «scanf »«( »<expr>«) » «; »
<outop> := «prіntf » «( » <expr>«) » «; »
<repeatop> := «repeat » <block> «untіl »«( »<expr>«) »; »
<type> := «float »
<іd> := <letter>[{<letter>|<number>}]
<num> := <number>[{<number>}]
<letter> := a|b|c|d|e|f|g|h|і|j|k|l|n|m|o|p|q|r|s|t|u|v|w|x|y|z| A|B|C|D|E|F|G|H|І|J|K|L|N|M|O|P|Q|R|S|T|U|V|W|X|Y|Z
<number> := 0|1|2|3|4|5|6|7|8|9
<expr> := <operand> [{<op> <operand>}]
<operand> :=» ( «<expr>») » | <num> | <іd> [«[ «<expr>»] »]
<op> := <grteq>
<іnv> := <logіcalop>| «* » | «/»
<logіcalop> := «– » | «+ » | [<op>]
Формальний опис складено за допомогою 21-ого нетермінального виразу.
2.2 Розробка лексичного аналізатора
Основна задача лексичного аналізу – розбити вихідний текст, що складається з послідовності одиночних символів, на послідовність слів, або лексем, тобто виділити ці слова з безперервної послідовності символів. Всі символи вхідної послідовності з цієї точки зору розділяються на символи, що належать яким-небудь лексемам, і символи, що розділяють лексеми. В цьому випадку використовуються звичайні засоби обробки рядків. Вхідна програма проглядається послідовно з початку до кінця. Базові елементи, або лексичні одиниці, розділяються пробілами, знаками операцій і спеціальними символами (новий рядок, знак табуляції), і таким чином виділяються та розпізнаються ідентифікатори, літерали і термінальні символи (операції, ключові слова).
При виділенні лексеми вона розпізнається та записується у таблицю лексем за допомогою відповідного номера лексеми, що є унікальним для кожної лексеми із усього можливого їх набору. Це дає можливість наступним фазам компіляції звертатись лексеми не як до послідовності символів, а як до унікального номера лексеми, що значно спрощує роботу синтаксичного аналізатора: легко перевіряти належність лексеми до відповідної синтаксичної конструкції та є можливість легкого перегляду програми, як вгору, так і вниз, від текучої позиції аналізу. Також в таблиці лексем ведуться записи, щодо рядка відповідної лексеми – для місця помилки – та додаткова інформація.
При лексичному аналізі виявляються і відзначаються лексичні помилки (наприклад, недопустимі символи і неправильні ідентифікатори). Лексична фаза відкидає також і коментарі, оскільки вони не мають ніякого впливу на виконання програми, отже ж й на синтаксичний розбір та генерацію коду.
Лексичний аналізатор (сканер) не обов’язково обробляє всю програму до початку всіх інших фаз. Якщо лексичний аналіз не виділяється як окрема фаза компіляції, а є частиною синтаксичного аналізу, то лексична обробка тексту програми виконується по мірі необхідності по запиту синтаксичного аналізатора.