У нас есть задание сделать компилятор. Мы уже провели лексический и синтаксический анализ, но застряли на генерации промежуточного кода. Мы поняли, что нам нужно реализовать таблицу символов, чтобы перейти к генерации промежуточного кода, и мы не знаем, как это сделать и что в ней содержится.
Учитывая приведенный ниже код, что должна содержать таблица символов? (Код написан на образовательном языке, который описан ниже)
Также как мы можем реализовать области видимости в нашей таблице символов?
:: = PROGRAM ID ENDPROGRAM <БЛОК> :: = {<ОБЪЯВЛЕНИЯ> <ПОДПРОГРАММЫ> <ПОСЛЕДОВАТЕЛЬНОСТЬ>} <ЗАЯВЛЕНИЯ> :: = ε | DECLARE ENDDECLARE :: = ε | Я СДЕЛАЛ )* <ПОДПРОГРАММЫ> :: = ( ) * :: = ID ПРОЦЕДУРЫ ENDPROCEDURE | ИД ФУНКЦИИ ENDFUNCTION :: = :: = ε | (<ФОРМАЛЬНЫЙ СПИСОК>) :: = (, ) * :: = IN ID | INOUT ID <ПОСЛЕДОВАТЕЛЬНОСТЬ> :: = <ЗАЯВЛЕНИЕ> (; <ЗАЯВЛЕНИЕ>) * <ЗАЯВЛЕНИЕ> :: = ε | <НАЗНАЧЕНИЕ-СТАТИСТИКА> | | | | | | <ВОЗВРАТ-СТАТИСТИКА> <СОСТОЯНИЕ НАЗНАЧЕНИЯ> :: = ID: = <ВЫРАЖЕНИЕ> :: = IF THEN ENDIF :: = ε | ИНАЧЕ <ПОСЛЕДОВАТЕЛЬНОСТЬ> :: = DO { } WHILE ( ) :: = ( ; ; ;) {<ПОСЛЕДОВАТЕЛЬНОСТЬ>} :: = ВЫХОД :: = CALL ID :: = ( ) | ε :: = (, ) * :: = IN | INOUT ID :: = RETURN <СОСТОЯНИЕ> :: = <БУЛТЕРМ> (ИЛИ <БУЛТЕРМ>) * :: = (И ) * :: = НЕ [<СОСТОЯНИЕ>] | [<СОСТОЯНИЕ>] | <ВЫРАЖЕНИЕ> <РАБОЧИЙ-ОПЕРАТОР> <ВЫРАЖЕНИЕ> | ИСТИНА | ЛОЖНЫЙ <ВЫРАЖЕНИЕ> :: = <ДОПОЛНИТЕЛЬНЫЙ ЗНАК> <ТЕРМ> (<ДОБАВЛЕНИЕ-ОПЕРАТОР> <ТЕРМ>) * <СРОК> :: = <ФАКТОР> (<МНОЖЕСТВЕННЫЙ ОПЕРАТОР> <ФАКТОР>) * <ФАКТОР> :: = ПОСТОЯННАЯ | (<ВЫРАЖЕНИЕ>) | ID :: = ε | <ОТНОСИТЕЛЬНЫЙ-ОПЕР> :: = = | <(ε | = |>) | > (ε | =) <ДОБАВИТЬ-ОПЕР> :: = + | - :: = * | / <ДОПОЛНИТЕЛЬНЫЙ ЗНАК> :: = ε | <ДОБАВИТЬ-ОПЕРАТОР>
PROGRAM MULTIPLY
{
DECLARE
A, B, C
ENDDECLARE
PROCEDURE Aop(INOUT A)
{
A=A+1;
}
ENDPROCEDURE
FUNCTION Bop(IN B){
IF [NOT[[TRUE AND FALSE]OR[TRUE]]] THEN B := 100 / 2;
ELSE B := 100;
ENDIF;
RETURN B;
}
ENDFUNCTION
CALL Aop(INOUT A);
CALL Bop(IN B);
A := 40;
C := A * B;
}
ENDPROGRAM