- •3. Описание этапа синтаксического анализа
- •3.1. Посторенние кс-грамматики входного языка и разбиение ее на подграмматики
- •3.2. Описание промежуточного языка
- •3.3. Неформальное описание перевода
- •3.4. Построение атрибутной транслирующей грамматики
- •3.5. Построение атрибутного дмп-процессора
- •3.6. Тестирование атрибутного дмп-процессора
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