Курсовая: Построение функции предшествования по заданной КС-грамматике - текст курсовой. Скачать бесплатно.
Банк рефератов, курсовых и дипломных работ. Много и бесплатно. # | Правила оформления работ | Добавить в избранное
 
 
   
Меню Меню Меню Меню Меню
   
Napishem.com Napishem.com Napishem.com

Курсовая

Построение функции предшествования по заданной КС-грамматике

Банк рефератов / Программирование

Рубрики  Рубрики реферат банка

закрыть
Категория: Курсовая работа
Язык курсовой: Русский
Дата добавления:   
 
Скачать
Архив Zip, 162 kb, скачать бесплатно
Заказать
Узнать стоимость написания уникальной курсовой работы

Узнайте стоимость написания уникальной работы

30 САМАРСКИЙ ГОСУДАРСТВЕН НЫЙ АЭРОКОСМИЧЕСКИЙ УНИВЕРСИТЕТ имени академика С.П . КОРОЛЕВА Кафедра информационных систем и технологий ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к курсовому проекту по курсу "Информационные технологии " на тему "Построение функции предшествования по заданной КС-грамматике " Выполнил : студент группы 634 Абраров А.М. Руководитель проекта : Шамашов М.А. Дата сдачи : Оценка : Самара 2001 г. РЕФЕРАТ Курсовой проект Пояснительная записка : 30 с ., 5 рис ., 3 схем программ и алгоритмов , 3 библиографического источника. ТЕРМИНАЛ , НЕТЕРМИНАЛ , ГРАММАТИКА , ФУНКЦИЯ ПРЕДШЕСТВОВАНИ , ГРАФ , ЛИНЕАРИЗАЦИЯ. В курсовом проекте разработан алгоритм и соответствующая ему программа , позволяющая по введённой пользователем КС-грамматике построить функцию предшествования , используя граф л инеаризации и алгоритм пересчета с визуализацией шагов построения графа . Грамматика может быть введена как в самой программе , так и из текстового файла . Также существует возможность сохранения результата . Программа написана на языке Pascal 7.0. СОДЕРЖАНИЕ СОДЕРЖАНИЕ 3 1. Постановка задачи 4 2. Описание структуры данных 5 3. Грамматики предшествования 6 3.1 Грамматик и простого предшествования 6 3.2 Грамматик и операторного предшествования 8 3.3 Пример построения матрицы предшествования 10 3.4 Линеаризация матрицы предшествования 13 4. Руководство пользов ателя 13 5. Текст программы 15 6. Список использованных источников 30 1. Постановка задачи По заданной КС-грамматике построить отношение простого или операторного предшествова ния и функцию предшествования , используя граф линеаризации и алгоритм пересчета с визуализацией шагов построения графа. 2. Описание структуры данных Типы : Для хранения терминалов и терминалов используется тип : notTerm=^List; List=Record список терминалов и нетерминалов Name:Str10; терминал или нетерминал Next : notTerm ; End ; Для хранения грамматики (текста ) используется : strBuf=array [1..800] of Char; Матрица предшествования : matrixPr=array [1..20,1..20] of 0..4; Функция предшествования : FuncPr = array [1..2,1..20] of Byte ; Процедуры и функции (основные ): Ввод грамматики осуществляется функцией : Function InputText : Boolean ; Для синтаксического анализа КС-грамматики используетс я процедура : Procedure Check ; Для нахождения «левых» и «правых» используется процедура : Procedure SearchLR ; Построение матрицы предшествования выполняет процедура : Procedure Matrix ; Построение функции предшествования осуществляется процедурой : Procedure Fu ncPrecede ; 3. Грамматики предшествования КС-языки делятся на классы в соответствии со структурой правил их грамматик . В каждом из классов налагаются дополнительные ограничения на допустимые правила грамматики. Одним из таких клас сов является класс грамматик предшествования . Они используются для синтаксического разбора цепочек с помощью алгоритма “сдвиг-свертка” . Выделяют следующие типы грамматик предшествования : · простого предшествования ; · расширенного предшествования ; · сл абого предшествования ; · смешанной стратегии предшествования ; · операторного предшествования . Далее будут рассмотрены ограничения на структуру правил и алгоритмы разбора для двух типов - грамматик простого и операторного предшествования. 3.1 Грамматик и простого предшествования Грамматикой простого предшествования называют такую КС-грамматику G ( VN , VT , P ,S), V = VT И VN в которой : 1. Для каждой упорядоченной пары терминальных и нетерминальных символов выполняется не более чем одно из трех отношений предшествования : · S i = S j ( " S i ,S j О V ), если и только если $ правило U ® xS i S j y О P , где U О VN , x,y О V * ; · S i < S j ( " S i ,S j О V ), если и только если $ правило U ® xS i Dy О P и вывод D Ю *S j z, где U,D О VN , x,y,z О V * ; · S i > S j ( " S i ,S j О V ) , если и только если $ правило U ® xCS j y О P и вывод C Ю *zS i или $ правило U ® xCDy О P и выводы C Ю *zS i и D Ю *S j w, где U,C,D О VN , x,y,z,w О V * . 2. Различные порождающие правила имеют разные правые части . Отношения =, < и > называют отношениями предшество вания для символов . Отношение предшествования единственно для каждой упорядоченной пары символов . При этом между какими-либо двумя символами может и не быть отношения предшествования - это значит , что они не могут находиться рядом ни в одном элементе разб о ра синтаксически правильной цепочки . Отношения предшествования зависят от порядка , в котором стоят символы , и в этом смысле их нельзя путать со знаками математических операций - например , если S i > S j , то не обязательно , что S j < S i (поэтому знаки предшест вования иногда помечают специальной точкой : = Ч , < Ч , Ч >) Метод предшествования основан на том факте , что отношения предшествования между двумя соседними символами распознаваемой строки соответствуют трем следующим вариантам : · S i < S i+1 , если символ S i+ 1 - крайний левый символ некоторой основы ; · S i > S i+1 , если символ S i - крайний правый символ некоторой основы ; · S i = S i+1 , если символы S i и S i+1 принадлежат одной основе . Исходя из этих соотношений выполняется разбор строки для грамматики предше ствования. На основании отношений предшествования строят матрицу предшествования грамматики . Строки матрицы предшествования помечаются первыми символами , столбцы - вторыми символами отношений предшествования , а в клетки матрицы на пересечении соответствующ их столбца и строки помещаются знаки отношений . При этом пустые клетки матрицы говорят о том , что между данными символами нет ни одного отношения предшествования. Матрицу предшествования грамматики можно построить , опираясь непосредственно на определения о тношений предшествования , но удобнее воспользоваться двумя дополнительными множествами - множеством крайних левых и множеством крайних правых символов относительно нетерминалов грамматики . Эти множества определяются следующим образом : · L (U) = T | $ U Ю * Tz , U,T О V , z О V * - множество крайних левых символов относительно нетерминального символа U (цепочка z может быть и пустой цепочкой ); · R (U) = T | $ U Ю *zT , U,T О V , z О V * - множество крайних правых символов относительно нетерминального символа U. Тог да отношения предшествования можно определить так : · S i = S j ( " S i ,S j О V ), если $ правило U ® xS i S j y О P , где U О VN , x,y О V * ; · S i < S j ( " S i ,S j О V ), если $ правило U ® xS i Dy О P и S j О L (D), где U,D О VN , x,y О V * ; · S i > S j ( " S i ,S j О V ) , если $ правило U ® xCS j y О P и S i О R (C) или $ правило U ® xCDy О P и S i О R (C), S j О L (D), где U,C,D О VN , x,y О V * . Такое определение отношений удобнее на практике , так как не требует построения выводов , а множества L (U) и R (U) могут быть построены для каждого нетерминально го символа U О VN по очень простому алгоритму : Шаг 1. Для каждого нетерминального символа U ищем все правила , содержащие U в левой части . Во множество L (U) включаем самый левый символ из правой части правил , а во множество R (U) - самый крайний символ правой части . Переходи к шагу 2. Шаг 2. Для каждого нетерминального символа U: если множество L (U) содержит нетерминальные символы грамматики U ’ ,U” ,..., то его надо дополнить символами , входящими в соответствующие множества L (U ’ ), L (U” ), ... и не входящими в L (U ). Ту же операцию надо выполнить для R (U). Шаг 3. Если на предыдущем шаге хотя бы одно множество L (U) или R (U) для некоторого символа грамматики изменилось , то надо вернуться к шагу 2, иначе построение закончено. После построения множеств L (U) и R (U) по пр авилам грамматики создается матрица предшествования . Матрицу предшествования дополняют символами ^ н и ^ к (начало и конец цепочки ). Для них определены следующие отношения предшествования : ^ н < a, " a О V , если $ S Ю *ax, где S О VN , x О V * или (с другой стор оны ) если a О L (S); ^ к > a, " a О V , если $ S Ю *xa, где S О VN , x О V * или (с другой стороны ) если a О R (S). 3.2 Грамматик и операторного предшествования Грамматикой операторного предшествования называется приведенная КС-грамматика без l -правил (e-правил ), в которой правые части продукций не содержат смежных нетерминальных символов . Для грамматики операторного предшествования отношения предшествования можно задать на множестве терминальных символов (включая символы ^ н и ^ к ). Отношени я предшествования для грамматики операторного предшествования G ( VN , VT , P ,S) задаются следующим образом : · a = b, если и только если существует правило U ® xaby О P или правило U ® xaCby, где a,b О VT , U,C О VN , x,y О V * ; · a < b, если и только если существует правило U ® xaCy О P и вывод C Ю *bz или вывод C Ю *Dbz, где a,b О VT , U,C,D О VN , x,y,z О V * ; · a > b, если и только если существует правило U ® xCby О P и вывод C Ю *za или вывод C Ю *zaD, где a,b О VT , U,C,D О VN , x,y,z О V * . В грамматике операторного предшеств ования различные порождающие правила имеют разные правые части . Для грамматики операторного предшествования тоже строится матрица предшествования , но она содержит только терминальные символы грамматики. Для построения этой матрицы удобно ввести множества к райних левых и крайних правых терминальных символов относительно нетерминального символа U - L t (U) или R t (U): · L t (U) = t | $ U Ю *tz или $ U Ю *Ctz , где t О VT , U,C О VN , z О V * ; · R t (U) = t | $ U Ю *zt или $ U Ю *ztC , где t О VT , U,C О VN , z О V * . Тогда о пределения отношений операторного предшествования будут выглядеть так : · a = b, если $ правило U ® xaby О P или правило U ® xaCby, где a,b О VT , U,C О VN , x,y О V * ; · a < b, если $ правило U ® xaCy О P и b О L t (C), где a,b О VT , U,C О VN , x,y О V * ; · a > b, есл и $ правило U ® xCby О P и a О R t (C), где a,b О VT , U,C О VN , x,y О V * . В данных определениях цепочки символов x,y,z могут быть и пустыми цепочками. Для нахождения множеств L t (U) и R t (U) используется следующий алгоритм : Шаг 1. Для каждого нетерминального симво ла грамматики U строятся множества L (U) и R (U). Шаг 2. Для каждого нетерминального символа грамматики U ищутся правила вида U ® tz и U ® Ctz, где t О VT , C О VN , z О V * ; терминальные символы t включаются во множество L t (U). Аналогично для множества R t (U) ищутся правила вида U ® zt и U ® ztC. Шаг 3. Просматривается множество L (U), в которое входят символы U ’ ,U” ,... Множество L t (U) дополняется символами , входящими в L t (U ’ ), L t (U” ), ... и не входящими в L t (U). Аналогичная операция выполняется и для множества R t (U) на основе множества R (U). Для практического использования матрицу предшествования дополняют символами ^ н и ^ к (начало и конец цепочки ). Для них определены следующие отношения предшествования : ^ н < a, " a О VT , если $ S Ю *ax или $ S Ю *Cax, где S,C О VN , x О V * или если a О L t (S); ^ к > a, " a О VT , если $ S Ю *xa или $ S Ю *xaC, где S,C О VN , x О V * или если a О R t (S). 3.3 Пример построения матрицы предшествования Построим матрицу предшествования для грамматики операторного предшествования. Рассмотрим в качестве примера грамматику G ( S,B,T,J , - , & , ^ , ( , ) , p , P ,S): (Терминалы выделены жирным шрифтом ) P : S ® - B (правило 1) B ® T | B & T (правила 2 и 3) T ® J | T ^ J (правила 4 и 5) J ® ( B ) | p (правила 6 и 7) Видно , что эта грамматика является грамма тикой операторного предшествования. Построим множества крайних левых и крайних правых символов L (U), R (U) относительно всех нетерминальных символов грамматики . Результат построения приведен в табл . 2. На основе полученных множеств построим множества крайни х левых и крайних правых терминальных символов L t (U), R t (U) относительно всех нетерминальных символов грамматики . Результат (второй и третий шаги построения ) приведен в табл . 3. Таблица 2. Множества крайних правых и крайних левых символов грамматики (по ш агам построения ) Символ Шаг 1 (начало построения ) Последний шаг (результат ) (U) L (U) R (U) L (U) R (U) J ( p ) p ( p ) p T J T J J T ( p J ) p B T B T T B J ( p T J ) p S - B - B T J ) p Таблица 3. Множества крайних правых и левых терминальных символов грамматики (по шагам построения ) Символ Шаг 1 (начало построения ) Последний шаг (результат ) (U) L t (U) R t (U) L t (U) R t (U) J ( p ) p ( p ) p T ^ ^ ^ ( p ^ ) p B & & & ^ ( p & ^ ) p S - - - - & ^ ) p На основе этих множеств и правил грамматики G построим матрицу предшествования грамматики (табл . 4). Таблица 4. Матрица предшествования грамматики Символы - & ^ ( ) p ^ к - < < < < > & > < < > < > ^ > > < > < > ( < < < = < ) > > > > P > > > > ^ н < Посмотрим , как заполняется матрица предшествования в табл . 4 на примере символа & . В правиле грамматики B ® B & T (правило 3) этот символ стоит слева от нетерминально го символа T. В множество L t (T) входят символы : ^ ( p . Ставим знак < в клетках матрицы , соответствующих этим символам , в строке для символа & . В то же время в этом же правиле символ & стоит справа от нетерминального символа B. В множество R t (B) входят симв олы : & ^ ) p . Ставим знак > в клетках матрицы , соответствующим этим символам , в столбце для символа & . Больше символ & ни в каком правиле не встречается , значит заполнение матрицы для него закончено , берем следующий символ и продолжаем заполнять матрицу та ким же методом. Алгоритм разбора цепочек грамматики операторного предшествования игнорирует нетерминальные символы . Поэтому имеет смысл преобразовать исходную грамматику таким образом , чтобы оставить в ней только один нетерминальный символ . Тогда получим с ледующий вид правил : P : E ® - E (правило 1) E ® E | E & E (правила 2 и 3) E ® E | E ^ E (правила 4 и 5) E ® ( E ) | p (правила 6 и 7) Это преобразование не ведет к созданию эквивалентной грамматики и выполняется только после построения всех множеств и матрицы пре дшествования . Само преобразование выполняется только с целью более эффективного выполнения алгоритма разбора , в который уже заложены необходимые данные о порядке применения правил при создании матрицы предшествования. 3.4 Линеаризация матрицы предшествования Для компактного хранения матрицы предшествования часто можно использовать следующий прием . По матрице M[n][n], элементы которой принимают только три значения (< = >), попытаемся построить два целочисленных вектора f и g: M[i][j] равно >, если f[i]>g[j] M[i][j] равно <, если f[i]G[j], если i > j - построить ребро графа F[i]<-G[j], если i < j - склеить вершины F[i] и G[j], если i = j Если полученный граф циклический , то линеаризация невозможна . Иначе положить f[i] равным длине самого длинного пути из F[i], g[i] равным дл ине самого длинного пути из G[i]. 4. Руководство пользователя После запуска программы пользователю предлагается ввести КС-грамматику (ограничение при вводе : длина нетерминала не больше восьми символов ). Ввод строки заканчивается нажатием клавиши Enter . Для определения в программе нетерминала используются символы ‘ < ’ и ‘ > ’ непосредственно между которыми находится нетерминал , знак или ‘ | ’ , знак присвоить ‘ := ’ . Новая строка обязательно должна начинаться с нетерминала и последующим си мволом (и ) ‘ := ’ . Для начала анализа введённой КС-грамматике нужно нажать клавишу F 5 или выбрать в меню пункт «Запуск» (меню вызывается нажатием F 9 ). Перед тем как начать построение матрицы предшествования производится синтаксический анализ введенного текста. Возможные ошибки при вводе грамматики : После символа ‘ | ’ должен обязательно следовать терминал или нетерминал. В грамматике описан нетерминал < F >, но он нигде не используется (отсутствует в правой части ). В грамматике отсутствует описание нетерминала < ZZZ > (отсутствует в правой части ) Если грамматика введена верно , то начинается построение матрицы (алгоритм описан выше ). При возникновении ошибки (один или несколько (не )терминалов имеют более чем одно отношение предшествования ) выводится сообщение и в соответствующую ячейку записыв ается символ Х . После этого выполняется линеаризация матрицы с помощью графа : для упрощения алгоритма в матрице сначала ведется поиск отношений = при нахождении таковых выполняется склеивание соответствующих вершин . Эта операция избавляет нас от рутинных д ействий связанных с «перестановкой» связей . Также упрощается описание графа в программе : надобность в хранении связей отсутствует - необходимо лишь хранить количество входящих и выходящих ребер . При построении векторов граф , проверяется на цикличность (пр и существовании цикла выводится сообщении о невозможности построения функции предшествования ). 5. Текст программы Program KP; Uses TpCrt,Graph,GrText,DataUnit; Const Txt='По заданной КС-грамматике построить отношение простого '+ ' или операторного предшествования и функцию предшествования ,'+ ' используя граф линеаризации и алгоритм пересчета с визуализацией '+ ' шагов построения графа '; Errors : array [0..10] of String[34] = ошибки (' КС-грамм атика синтаксически верна ', 0 ' Ожидается ~"<"', 1 ' Ожидается ~">"', 2 ' Ожидается ~":="', 3 ' Требуется нетерминал ', 4 ' Требуется терминал ', 5 ' Неопределенный нетерминал ', 6 ' Неиспользуемый нетерминал ', 7 ' Требуется терминал или нетерминал ', 8 ' Многоопределенный нетерминал ', 9 ' Найдены недопустимые символы '); 10 menu:array[1..5] of string[10]= ('От крыть ','Сохранить ','Запуск ','Информация ','Выход '); Type notTerm=^List; List=Record список терминалов и нетерминалов Name:Str10; терминал или нетерминал Next:notTerm; End; strBuf=array [1..800] of Char; matrixPr=array [1.. 20,1..20] of 0..4; Var i:Byte; текущая позиция s:String; текущая строка Len:Byte absolute s; str_:strBuf; общий буфер для текста LenStr:Integer; всего символов в буфере CLine, кол-во строк y:Byte; текущая строка CTerm:Byte ; кол-во нетерминалов CTrmNotTrm:Byte; кол-во нетерминалов и терминалов notTerminalS:NotTerm; нетерминалы встречающиеся в правых частях notTerminalL:NotTerm; нетерминалы в левой части Trm_notTrm:NotTerm; список терминалов и нетерминалов LTN:NotTerm; левые RTN:NotTerm; правые tmp:NotTerm; временная переменная matrixPrecede:matrixPr; LenWin:Byte; ширина окна $I Dinamic.inc процедуры для работы с динамическими переменными $I GraphPr.inc графический интерфей с $I ServFunc.inc дополнительные процедуры обработки строки ---------------------------------------------------------------------------- Procedure Blank; (* пропуск управляющих символов и пробелов *) Begin While (i<=Len) and (S[i] = #32) do inc(i); End; Function Let(s:Char):Boolean; (* контроль букв *) Begin Let:=((s) >= 'A') and ((s) <= 'Z') or (s in RusLetters); End; Function Dig (s:Char;Var n:Byte):Boolean; (* контроль цифр *) Begin If (s >= '0 ') and (s <= '9') Then Begin n:=ord(s)-48; Dig:=true End Else Dig:=false End; Function Terminal (Var term:String):Boolean; (* поиск терминала *) Begin term:=''; If i<=Len Then While (i<=Len) and (S[i] in Digits+LatLetters+Punctuation+Service+RusLetters) and not (s[i]='<') and not (s[i]='>') and not (s[i]='|') Do Begin term:=term+s[i]; inc(i); End; Terminal:=term > ''; End; Funct ion notTerminal (Var term:String):Boolean; (* поиск нетерминала *) Var j:word; n:Byte; Ex:Boolean; Begin Blank; j:=i; term:=''; Ex:=True; If i<=Length(s) Then If Let(S[i]) Then Begin While (i<=Length(s)) and Let(S[i]) or Dig(S[i],n ) do Begin If (i-j) < 9 Then term:=term+S[i]; inc(i); End; If (i-j) > 8 Then Ex:=False Else Blank; End Else Ex:=False Else Ex:=False; notTerminal:=Ex; End; Procedure Check; Var term:String; Exist,Ex:Boolean; notT:List; k:Byte; Label notTerminalOrTerminal, OrS,LineS,EndS,Start,New,Gluk; Begin Goto Start; New: при возникновении ошибки DeleteList(NotTerminalS); DeleteList(NotTerminalL); DeleteList(Trm_NotTrm); If not InputText Then Exit; Start: один раз i:=1; y:=1; k:=1; CTerm:=0; CTrmNotTrm:=0; PosStr(1,s); первая строка If s='' Then Goto New; LineS: новая строка GotoXY(1,10);Write(s+' Длина анализ.строки ',Length(s),' '+#13#10,'y=',y,' всего строк ',Cline); Blank; If not (s[i]='<') Then Begin Error(1); Goto New; End Else Begin inc(i); Blank; If not notTerminal(term) Then Begin Error(4); Goto New; End Else Begin есть нетерминал Blank; If not (s[i]='>') Then Begin Error(2); Goto New; End Else записываем нетерминал Begin NotT.Name:='<'+term+'>'; If Search(NotTerminalL,NotT)>0 Then Begin многоопределенный Error(9); Goto New; End; If Search(Trm_Not Trm,NotT)=0 Then Begin Complete(Trm_NotTrm,NotT); в общий список теминалов &
1Архитектура и строительство
2Астрономия, авиация, космонавтика
 
3Безопасность жизнедеятельности
4Биология
 
5Военная кафедра, гражданская оборона
 
6География, экономическая география
7Геология и геодезия
8Государственное регулирование и налоги
 
9Естествознание
 
10Журналистика
 
11Законодательство и право
12Адвокатура
13Административное право
14Арбитражное процессуальное право
15Банковское право
16Государство и право
17Гражданское право и процесс
18Жилищное право
19Законодательство зарубежных стран
20Земельное право
21Конституционное право
22Конституционное право зарубежных стран
23Международное право
24Муниципальное право
25Налоговое право
26Римское право
27Семейное право
28Таможенное право
29Трудовое право
30Уголовное право и процесс
31Финансовое право
32Хозяйственное право
33Экологическое право
34Юриспруденция
 
35Иностранные языки
36Информатика, информационные технологии
37Базы данных
38Компьютерные сети
39Программирование
40Искусство и культура
41Краеведение
42Культурология
43Музыка
44История
45Биографии
46Историческая личность
47Литература
 
48Маркетинг и реклама
49Математика
50Медицина и здоровье
51Менеджмент
52Антикризисное управление
53Делопроизводство и документооборот
54Логистика
 
55Педагогика
56Политология
57Правоохранительные органы
58Криминалистика и криминология
59Прочее
60Психология
61Юридическая психология
 
62Радиоэлектроника
63Религия
 
64Сельское хозяйство и землепользование
65Социология
66Страхование
 
67Технологии
68Материаловедение
69Машиностроение
70Металлургия
71Транспорт
72Туризм
 
73Физика
74Физкультура и спорт
75Философия
 
76Химия
 
77Экология, охрана природы
78Экономика и финансы
79Анализ хозяйственной деятельности
80Банковское дело и кредитование
81Биржевое дело
82Бухгалтерский учет и аудит
83История экономических учений
84Международные отношения
85Предпринимательство, бизнес, микроэкономика
86Финансы
87Ценные бумаги и фондовый рынок
88Экономика предприятия
89Экономико-математическое моделирование
90Экономическая теория

 Анекдоты - это почти как рефераты, только короткие и смешные Следующий
У меня повышается самооценка, когда я нравлюсь котику, который ненавидит всех.
Anekdot.ru

Узнайте стоимость курсовой, диплома, реферата на заказ.

Обратите внимание, курсовая по программированию "Построение функции предшествования по заданной КС-грамматике", также как и все другие рефераты, курсовые, дипломные и другие работы вы можете скачать бесплатно.

Смотрите также:


Банк рефератов - РефератБанк.ру
© РефератБанк, 2002 - 2016
Рейтинг@Mail.ru