Реферат: Розробка системних програмних модулів систем програмування
LL аналізатор називається LL(*) аналізатором, якщо він не обмежений скінченним числом токенів для попереднього перегляду, а може приймати рішення визначаючи чи належать вхідні токени регулярній мові (наприклад використовуючи ДСкА).
Існує конкуренція між «європейською школою» проектування мов, яка віддає перевагу LL граматикам, та «американською», яка частіше використовує LR-граматики. Це багато в чому завдяки традиціям викладання та детальному опису методів та інструментів в літературі. Інший вплив іде від досліджень Ніклауса Вірта в вищій технічній школі Цюріха, які описували багато способів оптимізації LL(1) мов, та компіляторів.
Аналізатор працює на рядках з певної контекстно вільної граматики.
Аналізатор складається з
· вхідного буфера, в якому зберігається вхідний рядок
· стека в якому зберігають термінальні та нетермінальні символи з граматики, що аналізується.
· таблицю аналізу яка каже яке ( якщо існує ) правило граматики застосувати залежно від символів на вершині стеку, та наступного вхідного токена.
Аналізатор застосовує правило з таблиці, яке відповідає символу на вершині стеку (рядок таблиці) та символу з вхідного потоку (стовпець).
2. Формальний опис вхідної мови програмування
2.1. Деталізований опис вхідної мови в термінах розширеної нотації Бекуса-Наура.
<program>::=PROGRAM<name>VAR<VAR_blok>START<code_blok>FINISH.
<VAR_blok> ::=<declarations> [{;<declarations>} ];.
<declarations>::=INT32_t<declaration_i> [{,<declaration_i>}] | BOOLEAN <declaration_b> [{,<declaration_b>}] .
.<declaration_i> ::= <ident> [ << <const_i>] .
<declaration_b> ::= <ident> [ << <const_b>] .
<ident> ::= <letter>[<l _or_n>].
<l_or_n> ::= <letter>|<number> .
<letter>::=a|b|c|d|e|f|g|h|i|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 .
<const_i> ::= [-]<number>[{number}] .
<const_b> ::=TRUE|FALSE
<code_blok> ::= <statement> [{<statement>}] .
<statement> ::= <equation>|<cycle>|<READ>|<WRITE> .
<equation> ::= <ident> [>> <expression_i>|<expression_b>]; .
<expression_i>::= <term> [{ADD <term> | SUB <term>}].
<term>::=<ident>|<const_i>|<factor>.
<factor>::=[{MUL <term> | DIV <term>| MOD <term> | <brackets>}].
<brackets>::=(<expression_i>).
<expression_b>::= <term_b> [{== <term_b> | != <term_b> | LE<term_b>| GE <term_b>}].