Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
бАКАЛАВР_РАБОТА.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.13 Mб
Скачать

2.1.2 Грамматика языка исма

Синтаксический анализатор языкового процессора языка LISMA является нисходящим методом рекурсивного спуска, использует последовательность разбора слева направо, использует просмотр вперед на K символов без возвратов (LL(k)).

Согласно классификации Хомского грамматика языка является однозначной контекстно-свободной (КС).

Далее представлены КС-грамматики нерегулярных конструкций языка LISMA. Строчными латинскими буквами обозначены нетерминальные символы, прописными – элементы терминального алфавита. Описание конструкций приводится в двух формах для лучшего восприятия: псевдоязык и общепринятая в теории формальных грамматик – форма Бэкуса-Наура (BNF). Достаточно сложные конструкции сопровождаютсяфрагментами программ, иллюстрирующих их использование.

Вызов функции (F)

<идентификатор> ( <список_фактических_параметров> )

F → i b A P f

P → c A

P → c A P

Арифметическое выражение (A)

A → m O R

A → O R

R → a O

R → a O R

O → i

O → u

O → F

O → b A f

Пользовательская константа (C)

[const] <идентификатор> = [-] <число_без_знака> ;

C → n i k m u e

C → n i k u e

C → i k m u e

C → i k u e

Макрос (M)

macro <идентификатор> = <арифметическое_выражение> ;

M → p i k A e

Глобальное начальное условие (G)

<идентификатор> = [-] <число_без_знака> ;

G → i k m u e

G → i k u e

Локальное начальное условие (I)

<идентификатор> = <арифметическое_выражение> ;

I → i k A e

Уравнение (E)

<идентификатор> [‘|~] = <арифметическое_выражение> ;

E → i j k A e

Логическое выражение (L)

L → B

L → L o B

B → A x A

B → i

B → u

B → m u

B → b L f

B → y b B f

B – атомарная составляющая логического выражения. Например: x>=y, abs(sin(x))<0, not (((((x+5)))!=7)), true, -5.

Условный оператор (Q)

if ( <логическое_выражение> ) then <последовательность_действий> endif ;

Q → q b L f r H t e

H → I

H → H I

Пример:

if (y<0) then

v=-v;

endif;

Локальное состояние (W)

<условно_адресная_пара> is <операторы><секция_from> ;

<операторы> → { <локальное_начальное_значение> | <уравнение> }

<секция_from> → from <условно_адресная_пара>{‘,’ <условно_адресная_пара>}

<условно_адресная_пара> → <идентификатор> [ ‘[’ <логическое_выражение> ‘]’ ]

Программа (S)

< константы_и_макросы><динамическая_часть><гибридная_часть>

S → T U V

T → C

T → M

T → T C

T → T M

U → E

U → U E

V → W

V → V W

Пример программы:

x1=0; x2=4;

w=2.5;

v1=2; v2=1;

r1=0; r2=0;

st1 [ (x1<=r1) ] is

x1'=w-v1;

x2'=-v2;

from;

st2 [ (x2<=r2) ] is

x1'=-v1;

x2'=w-v2;

from;

Из определения конструкции Программа видно, что корректность структуры программы контролируется уже на этапе синтаксического анализа.

Для удобства классификации перепишем грамматику в расширенной форме Бэкуса-Наура (EBNF), используя правила свертки. Грамматика LISMA принимает вид:

1) S → A B C // программа

2) A → { D | E }

3) B → { F | G }

4) C → { H }

5) H → i g I h v { J | F } w [ i [ g I h] { c i [ g I h]} ] // локальное состояние

6) G → q b I f r J { J } t e // условный оператор

7) I → K { o K } // логическое выражение

8) K → L x L | i | [m] u | [y] b I f

9) F → i j k L e // уравнение

10) J → i k L e // лок. начальное значение

11) M → i k [m] u e // глоб. начальное значение

12) E → p i k L e // макрос

13) D → [n] i k [m] u e // пользовательская константа

14) L → [m] O { a | m O} // арифметическое выражение

15) O → i | u | P | b L f

16) P → i b L { c L } f // вызов функции

В качестве алгоритма, реализующего нейтрализацию синтаксических ошибок, используется алгоритм Айронса [11].