// 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(); // Размещение переменных }