unit SemanticUnit;

interface

uses
  Hash, LexemArrType;

function CheckSemantic(var L: LexemArr; var N: Integer): LexemArr;

implementation

 // Вспомогательные функции Проверка на принадлежность к цифре или символу\\

function IsNum(c: char): Boolean;
begin
  Result := True;
  if (c > '9') or (c < '1') then
    Result := False;	
end;

function IsSymbol(c: char): Boolean;// Выдаст True, если символ
begin
  result := True;
  if (c > 'z') or (c < 'a') then
    result := False;
end;

 // Вспомогательные модули Проверка принадлежности к числу или идентификатору \\
function CheckNumber(s: String): Boolean;
var
  i: Integer;
begin
  Result := True;
  for i := 1 to Length(s) Do
    if not IsNum(s[i]) then begin
      Result := False;
      break;
    end;
end;

function CheckID(s: string): Boolean;// Выдаст TRUE если лексема начинается с символа
var
  i: Integer;
begin
  Result := True;
  if not IsSymbol(s[1]) then begin
    Result := False;
    exit;
  end;
end;

 // Основной модуль библиотеки. Проверка синтаксиса выражения \\

function CheckSemantic(var L: LexemArr; var N: Integer): LexemArr;
var
  i: Integer;
  t: text;
begin
  if N = 0 then Exit; // В случае ошибки выходим из функции
  assign(t, 'Hash4Lexems.txt');
  for i := 1 to N do 
  begin
    Result[i, 1] := L[i, 1];
    Reset(t);
    Result[i, 2] := HashFind(L[i, 1], t);
    Close(t);
    if L[i, 2] = 'ERROR' then
    begin
      Result[i, 1] := 'ERROR';
      if CheckID(L[i, 1]) then Result[i, 2] := 'ID' else // Проверка на принадлежность к ID
      if CheckNumber(L[i, 1]) then Result[i, 2] := 'NUMBER' else // Проверка на принадлежность к числу
      begin
        Result[i, 2] := 'ERROR'; // Иначе ошибка
        N := 0;
        Exit;
      end;
    end;
  end;
end;

end.