Advertisement
Guest User

Untitled

a guest
May 28th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.23 KB | None | 0 0
  1. unit LexElem;
  2.  
  3. interface
  4. { Модуль, описывающий структуру элементов таблицы лексем }
  5.  
  6. uses Classes, TblElem, LexType;
  7.  
  8. type
  9.  
  10. { Структура для информации о лексемах }
  11. TLexInfo = record
  12.   case LexType: TLexType of
  13.     LEX_VAR: (VarInfo: TVarInfo);
  14.     LEX_CONST: (ConstVal: integer);
  15.     LEX_START: (szInfo: PChar);
  16. end;
  17.  
  18. { Структура для описания лексемы }
  19. TLexem = class(TObject)
  20.  protected
  21.   { Информация о лексеме }
  22.   LexInfo: TLexInfo;
  23.   { Позиция лексемы в исходном тексте программы }
  24.   iStr,iPos,iAllP: integer;
  25.  public
  26.   { Конструкторы для создания лексем разных типов}
  27.   constructor CreateKey(LexKey: TLexType;
  28.                         iA,iSt,iP: integer);
  29.   constructor CreateVar(VarInf: TVarInfo;
  30.                         iA,iSt,iP: integer);
  31.   constructor CreateConst(iVal: integer;
  32.                           iA,iSt,iP: integer);
  33.   constructor CreateInfo(sInf: string;
  34.                          iA,iSt,iP: integer);
  35.   destructor Destroy; override;
  36.   { Свойства для получения информации о лексеме }
  37.   property LexType: TLexType read LexInfo.LexType;
  38.   property VarInfo: TVarInfo read LexInfo.VarInfo;
  39.   property ConstVal: integer read LexInfo.ConstVal;
  40.   { Свойства для чтения позиции лексемы
  41.     в исходном тексте программы }
  42.   property StrNum: integer read iStr;
  43.   property PosNum: integer read iPos;
  44.   property PosAll: integer read iAllP;
  45.   { Текстовая информация о типе лексемы }
  46.   function LexInfoStr: string;
  47.   { Имя для лексемы-переменной }
  48.   function VarName: string;
  49. end;
  50.  
  51. { Структура для описания списка лексем }
  52. TLexList = class(TList)
  53.  public
  54.   { Деструктор для освобождения памяти
  55.     при уничтожении списка }
  56.   destructor Destroy; override;
  57.   { Процедура очистки списка }
  58.   procedure Clear; override;
  59.   { Процедура и свойство для получения информации
  60.     о лексеме по ее номеру }
  61.   function GetLexem(iIdx: integer): TLexem;
  62.   property Lexem[iIdx: integer]: TLexem read GetLexem;
  63.            default;
  64. end;
  65.  
  66. implementation
  67.  
  68. uses SysUtils, LexAuto;
  69.  
  70. constructor TLexem.CreateKey(LexKey: TLexType;
  71.                              iA,iSt,iP: integer);
  72. { Конструктор создания лексемы типа "ключевое слово" }
  73. begin
  74.   inherited Create;
  75.   LexInfo.LexType := LexKey;
  76.   { запоминаем тип ключевого слова }
  77.   iStr := iSt; { запоминаем позицию лексемы }
  78.   iPos := iP;
  79.   iAllP := iA;
  80. end;
  81.  
  82. constructor TLexem.CreateVar(VarInf: TVarInfo;
  83.                              iA,iSt,iP: integer);
  84. { Конструктор создания лексемы типа "ключевое слово" }
  85. begin
  86.   inherited Create;
  87.   LexInfo.LexType := LEX_VAR; { тип - "переменная" }
  88.   { запоминаем ссылку на таблицу идентификаторов }
  89.   LexInfo.VarInfo := VarInf;
  90.   iStr := iSt; { запоминаем позицию лексемы }
  91.   iPos := iP;
  92.   iAllP := iA;
  93. end;
  94.  
  95. constructor TLexem.CreateConst(iVal: integer;
  96.                                iA,iSt,iP: integer);
  97. { Конструктор создания лексемы типа "константа" }
  98. begin
  99.   inherited Create;
  100.   LexInfo.LexType := LEX_CONST; { тип - "константа" }
  101.   { запоминаем значение константы }
  102.   LexInfo.ConstVal := iVal;
  103.   iStr := iSt; { запоминаем позицию лексемы }
  104.   iPos := iP;
  105.   iAllP := iA;
  106. end;
  107.  
  108. constructor TLexem.CreateInfo(sInf: string;
  109.                               iA,iSt,iP: integer);
  110. { Конструктор создания информационной лексемы }
  111. begin
  112.   inherited Create;
  113.   LexInfo.LexType := LEX_START; { тип - "доп. лексема" }
  114.   { выделяем память для информации }
  115.   LexInfo.szInfo :=  StrAlloc(Length(sInf)+1);
  116.   { запоминаем информацию }
  117.   StrPCopy(LexInfo.szInfo,sInf);
  118.   iStr := iSt; { запоминаем позицию лексемы }
  119.   iPos := iP;
  120.   iAllP := iA;
  121. end;
  122.  
  123. destructor TLexem.Destroy;
  124. begin
  125.   { Освобождаем занятую память,
  126.     если это информационная лексема }
  127.   if LexType = LEX_START then StrDispose(LexInfo.szInfo);
  128.   inherited Destroy;
  129. end;
  130.  
  131. function TLexem.VarName: string;
  132. { Функция получения имени лексемы типа "переменная" }
  133. begin
  134.   Result := VarInfo.VarName;
  135. end;
  136.  
  137. function TLexem.LexInfoStr: string;
  138. { Текстовая информация о типе лексемы }
  139. begin
  140.   case LexType of
  141.     LEX_VAR:   Result := VarName;
  142.     { для переменной - ее имя  }
  143.     LEX_CONST: Result := IntToStr(ConstVal);
  144.     { для константы - значение }
  145.     LEX_START: Result := StrPas(LexInfo.szInfo);
  146.     { для инф. лексемы - информация }
  147.     else       Result := LexTypeInfo(LexType);
  148.     { для остальных - имя типа }
  149.   end;
  150. end;
  151.  
  152. procedure TLexList.Clear;
  153. { Процедура очистки списка }
  154. var i: integer;
  155. begin
  156.   { Уничтожаем все элементы списка }
  157.   for i:=Count-1 downto 0 do Lexem[i].Free;
  158.   inherited Clear; { вызываем функцию базового класса }
  159. end;
  160.  
  161. destructor TLexList.Destroy;
  162. { Деструктор для освобождения памяти
  163.   при уничтожении списка }
  164. begin
  165.   Clear; { Уничтожаем все элементы списка }
  166.   { Вызываем деструктор базового класса }
  167.   inherited Destroy;
  168. end;
  169.  
  170. function TLexList.GetLexem(iIdx: integer): TLexem;
  171. { Получение лексемы из списка по ее номеру }
  172. begin
  173.   Result := TLexem(Items[iIdx]);
  174. end;
  175.  
  176. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement