Как создать таблицу символов

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

Учитывая приведенный ниже код, что должна содержать таблица символов? (Код написан на образовательном языке, который описан ниже)

Также как мы можем реализовать области видимости в нашей таблице символов?

  :: = 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
7
задан Bill the Lizard 15 February 2013 в 15:43
поделиться