Esempio n. 1
0
// MODULE Имя ";" [Импорт] ПослОбъявл [BEGIN ПослОператоров]
// END Имя "."
    static void Module()
    {
        Obj ModRef; //Ссылка на имя модуля в таблице

        Check(tLex.lexMODULE, "MODULE");
        if (Scan.Lex != tLex.lexName)
        {
            Error.Expected("имя модуля");
        }
        //Имя модуля - в таблицу имен
        ModRef = Table.NewName(Scan.Name, tCat.Module);
        Scan.NextLex();
        Check(tLex.lexSemi, "\";\"");
        if (Scan.Lex == tLex.lexIMPORT)
        {
            Import();
        }
        DeclSeq();
        if (Scan.Lex == tLex.lexBEGIN)
        {
            Scan.NextLex();
            StatSeq();
        }
        Check(tLex.lexEND, "END");

        //Сравнение имени модуля и имени после END
        if (Scan.Lex != tLex.lexName)
        {
            Error.Expected("имя модуля");
        }
        else if (Scan.Name != ModRef.Name)
        {
            Error.Expected(
                "имя модуля \"" + ModRef.Name + "\""
                );
        }
        else
        {
            Scan.NextLex();
        }
        if (Scan.Lex != tLex.lexDot)
        {
            Error.Expected("\".\"");
        }
        Gen.Cmd(0);              // Код возврата
        Gen.Cmd(OVM.cmStop);     // Команда останова
        Gen.AllocateVariables(); // Размещение переменных
    }