Скачиваний:
18
Добавлен:
01.05.2014
Размер:
461.82 Кб
Скачать

3. Описание этапа синтаксического анализа

3.1. Посторенние кс-грамматики входного языка и разбиение ее на подграмматики

Для построения КС-грамматики входного зыка необходимо:

  • заменить металингвистические переменные БНФ обозначениями нетерминальных символов, используя короткие имена;

  • в качестве терминальных символов использовать токены;

  • металингвистический символ «::=» заменить символом «→»;

  • заменить одну металингвистическую формулу с n альтернативами на n правил грамматики с одинаковым символом в левой части правила вывода;

  • исключить металингвистические символы { }и[ ], включив в правила грамматики рекурсивные правила и ε-правила.

Построенная в КС-грамматика не принадлежит классу SLR(1)-грамматик, поэтому требуется ее преобразовать. Выделим из исходной грамматики подграмматики таким образом, чтобы каждая из полученных грамматик принадлежала заданному классу.

Разбиение грамматики на подграмматики позволит использовать заданный метод синтаксического анализа, но усложнит описание и реализацию этого перевода, поскольку после разбиения перевод будет описываться с помощью нескольких взаимосвязаных атрибутных транслирующих грамматик.

При разбиении на подграмматики нужно учитывать следующее:

1. Совокупность выделенных из грамматики взаимосвязаных правил должна представлять собой КС-грамматику заданного класса.

2. Основной символ подграмматики становится (специальным) терминальным символом исходной грамматики (в приведенном ниже разбиение такие символы выделены курсивом).

Подграмматика G1 (головная подграмматика)

PROG → _PROG _ID; DEFH SOP

PROG → _PROG _ID; SOP

PROG → DEFH SOP

PROG → SOP

DEFH → DEFH DEF

DEFH → DEF

SOP → _BEGIN LOP _END.

DEF → _TYPE TSEC

DEF → _CONST CSEC

DEF → _VAR VSEC

DEF → _LABEL LSEC

TSEC → TSEC TDEF

TSEC → TDEF

TDEF → _ID = VLT;

LSEC → LDEF;

LDEF → LDEF, NL

LDEF → NL

NL → _ID

NL → _NUM

Подграмматика G1(описание типов)

VLT → _ARRAY STRT

VLT → SBT

VLT → _INT

VLT → _BOOL

Подграмматика G2(“хвост” описания матричного типа)

STRT → [ NM , NM ]

NM → _ID

NM → _NUM

Подграмматика G3(описания диапазонного типа)

SBT → _ID _DDOT _ID

SBT → _ID _DDOT NM

SBT → NM _DDOT _ID

SBT → NM _DDOT NM

SBT → _ID

NM → _NUM

NM → - _NUM

Подграмматика G4(список объявлений констант)

CSEC → CSEC CDEF

CSEC → CDEF

CDEF → _ID = VLC;

CDEF → _ID: _ARRAY STRT = MC;

CDEF → _ID: _ID = MC;

VLC → _ID

VLC → _NUM

VLC → - _NUM

VLC → _TRUE

VLC → _FALSE

Подграмматика G5(константа-матрица)

MC → (LLC)

LLC → LLC, (LC)

LLC → (LC)

LC → LC, BC

LC → BC

BC → _ID

BC → _TRUE

BC → _FALSE

Подграмматика G6(список объявлений переменных)

VSEC → VSEC VDEF

VSEC → VDEF

VDEF → LV: VLT;

LV → LV, _ID

LV → _ID

Подграмматика G7(оператор)

OP → _ID: UOP

OP → _NUM: UOP

OP → UOP

UOP → V _EQ EXP

UOP → _IF EXP _THEN IFOP

UOP → _REPEAT LOP _UNTIL EXP

UOP → _GOTO _ID

UOP → _GOTO _NUM

UOP → _READ(LV)

UOP → _WRITE(LE)

UOP → _WRITES(_STR)

UOP → _WRITEM(_ID)

UOP → _MOP(_ID, _ID, _ID)

UOP → _BEGIN LOP _END

V → _ID [_NUM, _NUM]

V → _ID [_ID, _NUM]

V → _ID [_NUM, _ID]

V → _ID [_ID, _ID]

V → _ID

LE → LE, EXP

LE → EXP

Подграмматика G8 (выражение)

EXP → EXP _REL EAR

EXP → EAR

EAR → EAR - EM

EAR → EAR + EM

EAR → EAR _OR EM

EAR → EM

EM → EM _MID EV

EM → EV

EV → _NOT EV

EV → - EV

EV → V

EV → _NUM

EV → _TRUE

EV → _FALSE

EV → (EXP)

V → _ID

V → _ID [_NUM, _NUM]

V → _ID [_ID, _NUM]

V → _ID [_NUM, _ID]

V → _ID [_ID, _ID]

Подграмматика G9(список идентификаторов)

LV → LV, _ID

LV → _ID

Подграмматика G10(“хвост” оператораif)

IFOP → OP _ELSE OP

IFOP → OP

Подграмматика G11(список операторов)

LOP → LLP;

LOP → LLP

LLP→ LLP; OP

LLP→ OP

Соседние файлы в папке report