亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? hashs.pas

?? Draak is a multi-language, macro compiler, meaning all syntax and code generation is defined in a si
?? PAS
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
(* hashs.pas: Please see the end of Draak.pas for copyright information       *)
(* This file may NOT be distributed without Draak.pas and is under the same   *)
(* licence agreement as Draak.pas.                                            *)
unit hashs;

interface
uses error;

Const HashSize = 50;
type
  AtomType = (Macro, Terminal, NonTerminal, id, str, num, hex, oct, bin);

  strArr = array of string;
  varArr = array[0..9] of string;

  PHashAtom = ^RHashAtom;
  RHashAtom = record
    next: PHashAtom;
    optional, star: boolean;
    case term: AtomType of
      Terminal: (terminal: PChar);
      NonTerminal: (nonTerminal: PChar; hashCode: word);
      Macro: (Macro: PChar;)
  end;

  PHashNode = ^RHashNode;
  RHashNode = record
    name: string;
    next: PHashNode;
    special: boolean;
    RHS, lastRHS: PHashAtom;
    Macros, lastMacro: PHashAtom;
  end;


  PHash = ^THash;
  THash = class
    private
      optin, star{, plus}: boolean;
      table: array[0..HashSize] of PHashNode;
      current: PHashNode;
    public
      procedure add(const named: string);
      procedure addRHS(const inS: string);
      procedure addToRHS(const s: string);
      procedure addMacro(const s: string);
      procedure clearCurrent;
      function hashLookup(const S: string): PHashNode; overload;
      function hashLookup(const S: string; hint: word; count: word = 0): PHashNode; overload;
  end;

  PVarNode = ^RVarNode;
  RVarNode = record
    name: string;
    next: PVarNode;
    isvar: boolean;
    baseType, nameType: string;
    equiv: strArr;
    local: varArr;
    typePtr: PVarNode;
    size: word;
    context: pointer;
    RHS, lastRHS: PHashAtom;
    LHS, lastLHS: PHashAtom;
//    ALT,
    lastALT: PHashAtom;
    ALT: array of PHashAtom;
    Decl, lastDecl: PHashAtom;
    altDecl, lastAltDecl: PHashAtom;
  end;

  PVars = ^TVars;
  TVars = class
    private
      name: string;
      table: array[0..HashSize] of PVarNode;
      current: PVarNode;
      hard: boolean;
      next: TVars;
      first: TVars;
      err: TError;
    public
      property harden: boolean write hard;
      constructor Create(const named: string; nextHash: TVars; error: TError);
      destructor destroy; override;
      procedure addVar(const named: string; const typed: string);
      procedure addType(const named: string; const base: string);
      procedure addBasedType(const named: string; const base: string);
      procedure attachType(const s: string);
      procedure addLHS(const s: string);
      procedure addRHS(const s: string);
      procedure addALT(const s: string);
      procedure addDecl(const s: string);
      procedure addAltDecl(const s: string);
      procedure clearCurrent;
      function pop: TVars;
      function isEquiv(const s, base: string): boolean;
      procedure addEquiv(const s, base: string);
      procedure saveLocal(const s: varArr);
      function getLocal(const s: string): varArr;
      procedure saveContext(context: TVars);
      function loadContext(const s: string): TVars;
      function hashLookup(const S: string; deep: integer = -1): PVarNode;
      procedure dump;
      procedure rmVar(const named: string);
//TODO      function getVarBlock(const S: string): TVars;
  end;

  PStringHash = ^RStringHash;
  RStringHash = record
    name: string;
    data: strArr;
    next: PStringHash;
  end;
 
  TStringHash = class
    private
      table: array[0..HashSize] of PStringHash;
    public
      destructor destroy; override;
      procedure add(s: string; data: string);
      procedure remove(s: string);
      procedure removeStr(s: string; data: string);
      procedure removeStrEnd(s: string; data: string);
      procedure inc(s, num: string);
      procedure append(s, data: string);
      procedure strictAppend(s, data: string);
      procedure insert(s, data: string);
      function first(s: string): string;
      function last(s: string): string;
      function len(s: string): string;
      function pos(s, data: string): string;
      function getSubStr(s: string; n: word): string;
      function lookup(s: string): strArr;
  end;

  function hash(s: string): word;

implementation

uses SysUtils, StrUtils, classes, draak;

function hash(s: string): word;
const hashCode = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
var i: word; tempHash: integer;
begin
  tempHash := 0; s := AnsiUpperCase(s);
  for i := 1 to length(s) do
  begin
    tempHash := tempHash + AnsiPos(s[i], hashCode);
  end;
  result := tempHash MOD HashSize;
end;

procedure THash.add(const named: string);
var dumbNode: PHashNode;
  hashCode: word;
begin
  new(dumbNode);
  dumbNode.special := false;
  dumbNode.name := named;
  hashCode := hash(named);
  dumbNode.next := table[hashCode];
  dumbNode.RHS := nil; dumbNode.lastRHS := nil;
  dumbNode.Macros := nil; dumbNode.lastMacro := nil;
  table[hashCode] := dumbNode;
  current := dumbNode;
end;

procedure THash.addRHS(const inS: string);
var s, tempS: string;
  posStr: word;
begin
  optin := false;
  s := inS;
  while s <> '' do
  begin
    case s[1] of
     ' ':
      begin
        delete(s, 1, 1);
        continue;
      end;
     '{':
      begin
        delete(s, 1, 1);
        optin := true;
      end;
     '}':
      begin
        delete(s, 1, 1);
        optin := false;
      end;
     '*':
      begin
       star := false;
       optin := false;
       delete(s, 1, 1);
      end;
     '<':
      begin
        posStr := AnsiPos('>', s);
        if s[posStr+1] = '*' then star := true else star := false;
        addToRHS(leftStr(s, posStr));
        delete(s, 1, posStr);
        tempS := '';
      end;
     else
      begin
        posStr := AnsiPos('<', s);
        if (s[1] = '\') AND (s[2] = '*') then
          delete(s, 1, 1);
        if posStr <> 0 then
        begin
          if s[posStr-1] = '\' then
          begin
            delete(s, posStr-1, 1);
            tempS := tempS + leftStr(s, posStr-1);
            delete(s, 1, posStr-1);
            continue;
          end else
          if s[posStr-1] = '{' then
            dec(posStr);
        end else posStr := length(s)+1;
        if tempS <> '' then if tempS[1] = '<' then insert(' ', tempS, 1);
        addToRHS(tempS + leftStr(s, posStr-1));
        delete(s, 1, posStr-1);
      end;
    end;
  end;
  if tempS = '<' then
    addToRHS(' <');
end;

procedure THash.addToRHS(const s: string);
var dumbAtom: PHashAtom;
begin
  if current = nil then exit;
  new(dumbAtom);
  dumbAtom.next := nil;
  dumbAtom.optional := optin;
  dumbAtom.star := star;
  if star = true then dumbAtom.optional := true;
//  dumbAtom.plus := plus;
  if AnsiSameText(s, '<id>') = true then
  begin
    dumbAtom.term := id;
    dumbAtom.nonTerminal := nil;
  end else
  if AnsiSameText(s, '<str>') = true then
  begin
    dumbAtom.term := str;
    dumbAtom.nonTerminal := nil;
  end else
  if AnsiSameText(s, '<num>') = true then
  begin
    dumbAtom.term := num;
    dumbAtom.nonTerminal := nil;
  end else
  if AnsiSameText(s, '<hex>') = true then
  begin
    dumbAtom.term := hex;
    dumbAtom.nonTerminal := nil;
  end else
  if AnsiSameText(s, '<oct>') = true then
  begin
    dumbAtom.term := oct;
    dumbAtom.nonTerminal := nil;
  end else
  if AnsiSameText(s, '<bin>') = true then
  begin
    dumbAtom.term := bin;
    dumbAtom.nonTerminal := nil;
  end else
  if s[1] = '<' then
  begin
    dumbAtom.term := nonTerminal;
    getMem(dumbAtom.nonTerminal, length(s)+1);
    strcopy(dumbAtom.nonTerminal, PChar(trim(s)));
    dumbAtom.hashCode := hash(s);
  end else
  begin
    dumbAtom.term := terminal;
    getMem(dumbAtom.terminal, length(s)+1);
    strcopy(dumbAtom.terminal, PChar(trim(s)));
  end;
  if current.lastRHS = nil then
  begin
    current.RHS := dumbAtom;
    current.lastRHS := dumbAtom;
  end else
  begin
    current.lastRHS.next := dumbAtom;
    current.lastRHS := dumbAtom;
  end;
end;

procedure THash.addMacro(const s: string);
var dumbAtom: PHashAtom;
begin
  trim(s);
  if current = nil then exit;
  new(dumbAtom);
  dumbAtom.next := nil;
  dumbAtom.term := macro;
  getMem(dumbAtom.macro, length(s)+1);
  strcopy(dumbAtom.macro, PChar(trim(s)));
  if current.lastMacro = nil then
  begin
    current.Macros := dumbAtom;
    current.lastMacro := dumbAtom;
  end else
  begin
    current.lastMacro.next := dumbAtom;
    current.lastMacro := dumbAtom;
  end;
end;

procedure THash.clearCurrent;
begin
  current := nil;
end;

function THash.hashLookup(const s: string): PHashNode;
begin
  result := hashLookup(s, hash(s));
end;

function THash.hashLookup(const s: string; hint: word; count: word): PHashNode;
var i: word;
begin
  result := table[hint];
  for i := 0 to count do
  begin
    while (result <> nil) and (AnsiCompareText(result.name, s) <> 0) do
    begin
      result := result.next;
    end;
    if result = nil then exit;
    if i <> count then
      result := result.next;
  end;
end;

constructor TVars.Create(const named: string; nextHash: TVars; error: TError);
begin
  next := nextHash;
  name := named;
  err := error;
  if nextHash = nil then first := self
  else first := nextHash.first;
end;

destructor TVars.Destroy;
var i: cardinal;
  dumbNode, nextNode: PVarNode;
begin
  if assigned(next) then next.destroy;
  for i := 0 to hashSize do
  begin
    dumbNode := table[i];
    while dumbNode <> nil do
    begin
      nextNode := dumbNode.next;
      if assigned(dumbNode.context) then
        TVars(dumbNode.context).destroy;
      dispose(dumbNode);
      dumbNode := nextNode;
    end;
  end;
end;

procedure TVars.addVar(const named: string; const typed: string);
var dumbNode: PVarNode;
  hashCode: word;
begin
  if assigned(self.hashLookup(named)) then
    err.err('Variable already exists: '+named);
  new(dumbNode);
  dumbNode.isvar := true;
  dumbNode.name := named;
  dumbNode.typePtr := hashLookup(typed);
  if dumbNode.typePtr = nil then
  begin
    err.err('No such type: ' + typed);
    exit;
  end;
  dumbNode.nameType := dumbNode.typePtr.name;
  dumbNode.baseType := dumbNode.typePtr.baseType;
  hashCode := hash(named);
  dumbNode.next := table[hashCode];
  dumbNode.context := nil;
  dumbNode.RHS := nil; dumbNode.lastRHS := nil;
  dumbNode.LHS := nil; dumbNode.lastLHS := nil;
  dumbNode.ALT := nil; dumbNode.lastALT := nil;
  dumbNode.Decl := nil; dumbNode.lastDecl := nil;
  dumbNode.altDecl := nil; dumbNode.lastAltDecl := nil;
  setLength(dumbNode.equiv, 0);
  table[hashCode] := dumbNode;
  current := dumbNode;
end;

procedure TVars.addBasedType(const named: string; const base: string);
var dumbNode, basePtr: PVarNode;
  hashCode: word;
begin
  new(dumbNode);
  dumbNode.name := named;
  dumbNode.isVar := false;
  hashCode := hash(named);
  dumbNode.next := table[hashCode];
  setLength(dumbNode.equiv, 0);
  if base[1] = '$' then
  begin
    err.err('Can not @T a basic type ('+base+').');
  end;
  basePtr := hashLookup(base);
  if basePtr = nil then
  begin
    err.err('No such type: '+base);
    exit;
  end;
  dumbNode.baseType := basePtr.baseType;
  dumbNode.equiv := copy(basePtr.equiv, 0, length(basePtr.equiv));

  dumbNode.nameType := base;
  dumbNode.typePtr := nil;
  dumbNode.context := nil;
  dumbNode.RHS := basePtr.RHS; dumbNode.lastRHS := basePtr.lastRHS;
  dumbNode.LHS := basePtr.LHS; dumbNode.lastLHS := basePtr.lastLHS;
  dumbNode.ALT := basePtr.ALT; dumbNode.lastALT := basePtr.lastALT;
  dumbNode.Decl := basePtr.Decl; dumbNode.lastDecl := basePtr.lastDecl;
  dumbNode.altDecl := basePtr.altDecl; dumbNode.lastAltDecl := basePtr.lastAltDecl;
  setLength(dumbNode.equiv, length(dumbNode.equiv)+1);
  dumbNode.equiv[length(dumbNode.equiv)-1] := base;
  table[hashCode] := dumbNode;
  current := dumbNode;
end;

procedure TVars.addType(const named: string; const base: string);
var dumbNode, basePtr: PVarNode;
  hashCode: word;
begin
  new(dumbNode);
  dumbNode.name := named;
  dumbNode.isVar := false;
  hashCode := hash(named);
  dumbNode.next := table[hashCode];
  setLength(dumbNode.equiv, 0);
  if base[1] <> '$' then
  begin
    basePtr := hashLookup(base);
    if basePtr = nil then
    begin
      err.err('No such type: '+base);
      exit;
    end;
    dumbNode.baseType := basePtr.baseType;
    dumbNode.equiv := copy(basePtr.equiv, 0, length(basePtr.equiv));
  end else
    dumbNode.baseType := named;
  dumbNode.nameType := base;
  dumbNode.typePtr := nil;
  dumbNode.context := nil;
  dumbNode.RHS := nil; dumbNode.lastRHS := nil;
  dumbNode.LHS := nil; dumbNode.lastLHS := nil;
  dumbNode.ALT := nil; //dumbNode.lastALT := nil;
  dumbNode.Decl := nil; dumbNode.lastDecl := nil;
  dumbNode.altDecl := nil; dumbNode.lastAltDecl := nil;
  setLength(dumbNode.equiv, length(dumbNode.equiv)+1);
  dumbNode.equiv[length(dumbNode.equiv)-1] := base;
  table[hashCode] := dumbNode;
  current := dumbNode;
end;

procedure TVars.attachType(const s: string);
var dumbNode, basePtr: PVarNode;
begin
  basePtr := hashLookup(s);
  if basePtr = nil then
  begin
    err.err('No such type: '+s);
    exit;
  end;
  dumbNode := Self.current;
  if dumbNode.RHS = nil then
    dumbNode.RHS := basePtr.RHS; dumbNode.lastRHS := basePtr.lastRHS;
  if dumbNode.LHS = nil then
    dumbNode.LHS := basePtr.LHS; dumbNode.lastLHS := basePtr.lastLHS;
  if dumbNode.ALT = nil then
    dumbNode.ALT := basePtr.ALT; dumbNode.lastALT := basePtr.lastALT;
  if dumbNode.Decl = nil then
    dumbNode.Decl := basePtr.Decl; dumbNode.lastDecl := basePtr.lastDecl;
  if dumbNode.altDecl = nil then
    dumbNode.altDecl := basePtr.altDecl; dumbNode.lastAltDecl := basePtr.lastAltDecl;
end;

procedure TVars.addLHS(const s: string);
var dumbAtom: PHashAtom;
begin
  trim(s);
  if current = nil then exit;
  new(dumbAtom);
  dumbAtom.next := nil;
  getMem(dumbAtom.Macro, length(s)+1);
  strcopy(dumbAtom.Macro, PChar(trim(s)));
  if current.lastLHS = nil then
    current.LHS := dumbAtom
  else
    current.lastLHS.next := dumbAtom;
  current.lastLHS := dumbAtom;
end;

procedure TVars.addRHS(const s: string);
var dumbAtom: PHashAtom;
begin
  trim(s);
  if current = nil then exit;
  new(dumbAtom);
  dumbAtom.next := nil;
  getMem(dumbAtom.Macro, length(s)+1);
  strcopy(dumbAtom.Macro, PChar(trim(s)));
  if current.lastRHS = nil then
    current.RHS := dumbAtom
  else
    current.lastRHS.next := dumbAtom;
  current.lastRHS := dumbAtom;
end;

procedure TVars.addALT(const s: string);
var dumbAtom: PHashAtom;
begin
//  trim(s);
  if current = nil then exit;
{  if s  = '' then
  begin
     setLength(current.ALT, length(current.ALT)+1);
     current.lastALT := nil;
  end else}
  case s[1] of
    '!', '@', '+', '*':
      if length(current.ALT) = 0 then
      begin
        setLength(current.ALT, 1);
  new(dumbAtom);
  dumbAtom.next := nil;
  dumbAtom.Macro := '';
        current.lastALT := dumbAtom;
        current.ALT[0] := dumbAtom;
      end;
   else
   begin
     setLength(current.ALT, length(current.ALT)+1);

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
69精品人人人人| 一区二区三区91| 日韩亚洲欧美综合| 欧美高清你懂得| 欧美精品久久99久久在免费线 | 亚洲人成伊人成综合网小说| 亚洲国产高清在线| 欧美国产欧美综合| 国产精品伦理一区二区| 国产精品久久久久久福利一牛影视| 国产性色一区二区| 国产精品免费久久| 亚洲日本在线看| 亚洲综合一区二区| 亚洲午夜久久久久久久久电影网| 亚洲韩国精品一区| 日韩—二三区免费观看av| 日本女优在线视频一区二区| 91在线国产福利| 色综合天天综合狠狠| 欧美系列亚洲系列| 日韩女优av电影| 国产网站一区二区| 亚洲欧洲www| 亚洲一区二区视频在线观看| 日本伊人精品一区二区三区观看方式| 琪琪一区二区三区| 国产成人免费在线视频| 99久久er热在这里只有精品66| 91丨九色丨尤物| 欧美人伦禁忌dvd放荡欲情| 日韩欧美一二三区| 国产精品美女视频| 亚洲成人第一页| 精品一区二区三区视频在线观看| 国产91精品免费| 在线观看亚洲a| 日韩欧美国产wwwww| 中文在线资源观看网站视频免费不卡| 自拍偷拍欧美精品| 日本在线不卡一区| 国产宾馆实践打屁股91| 欧美在线高清视频| 久久先锋影音av| 一区二区三区中文在线观看| 蜜桃av一区二区三区| 不卡的av电影| 91精品国产综合久久蜜臀| 国产日韩欧美一区二区三区乱码 | 国产在线播精品第三| 日韩免费观看2025年上映的电影 | 奇米影视一区二区三区| 成人黄页毛片网站| 91精品国产91久久久久久最新毛片| 久久久久久久久久看片| 亚洲国产成人高清精品| 成人一区在线看| 7777精品伊人久久久大香线蕉经典版下载 | √…a在线天堂一区| 久久精品国产亚洲5555| 成人免费高清在线观看| 91精品国产入口在线| 自拍偷在线精品自拍偷无码专区 | 奇米在线7777在线精品| av在线不卡观看免费观看| 日韩亚洲欧美中文三级| 一区二区三区不卡视频| 成人综合日日夜夜| 欧美电影免费提供在线观看| 亚洲激情av在线| 岛国精品在线观看| 欧美videos中文字幕| 艳妇臀荡乳欲伦亚洲一区| 国产99一区视频免费| 日韩视频中午一区| 亚洲国产aⅴ天堂久久| 99久久国产综合精品女不卡| 久久久噜噜噜久久人人看| 舔着乳尖日韩一区| 色88888久久久久久影院野外 | 天天影视涩香欲综合网| 91碰在线视频| 欧美国产综合色视频| 精品午夜一区二区三区在线观看| 欧美午夜电影一区| 亚洲另类中文字| 不卡影院免费观看| 久久精品在线免费观看| 九九久久精品视频| 91精品国产综合久久精品| 一区二区三区不卡视频在线观看| eeuss影院一区二区三区| 人人超碰91尤物精品国产| 91视频观看免费| 国产精品福利在线播放| 国产1区2区3区精品美女| 久久精品一区二区三区不卡牛牛| 乱中年女人伦av一区二区| 678五月天丁香亚洲综合网| 亚洲国产美女搞黄色| 日本丶国产丶欧美色综合| 亚洲欧美另类久久久精品| 99re成人精品视频| 亚洲欧美韩国综合色| 91伊人久久大香线蕉| 亚洲天堂中文字幕| 97se亚洲国产综合自在线不卡| 中文字幕乱码亚洲精品一区| 成人av综合在线| 国产精品传媒在线| www.66久久| 国产精品不卡在线观看| 91在线视频18| 亚洲综合一区二区| 欧美日韩成人高清| 奇米777欧美一区二区| 欧美精品一区视频| 国产精品一区二区无线| 国产精品美女一区二区| 色偷偷成人一区二区三区91| 一区二区三区成人| 91精品国产欧美一区二区18| 久久av资源网| 国产欧美日韩不卡免费| 95精品视频在线| 亚洲午夜在线观看视频在线| 3751色影院一区二区三区| 精品在线一区二区三区| 欧美精彩视频一区二区三区| 91视频在线观看| 日产国产欧美视频一区精品 | 亚洲午夜精品在线| 日韩一区二区三区精品视频 | 国产精品动漫网站| 色综合久久久网| 日韩在线一区二区三区| 精品处破学生在线二十三| 成人妖精视频yjsp地址| 一区二区三区免费在线观看| 69久久99精品久久久久婷婷 | 欧美精品成人一区二区三区四区| 日本午夜精品视频在线观看 | 日韩精品一区二区三区在线观看| 国产乱子伦视频一区二区三区| 1000精品久久久久久久久| 欧美日韩久久一区| 国产精品一区二区久激情瑜伽| 亚洲免费资源在线播放| 日韩视频123| 99视频有精品| 免费在线观看一区二区三区| 国产欧美精品一区二区色综合朱莉 | 91亚洲精品乱码久久久久久蜜桃| 丝袜a∨在线一区二区三区不卡| 久久精品人人做人人综合| 在线免费观看日韩欧美| 国产一区二区剧情av在线| 亚洲激情男女视频| 2021中文字幕一区亚洲| 91福利国产成人精品照片| 激情欧美一区二区| 亚洲一区二区影院| 日本一区二区三级电影在线观看| 欧美另类z0zxhd电影| 丁香婷婷综合激情五月色| 性做久久久久久久久| 中日韩免费视频中文字幕| 4438亚洲最大| 色综合天天性综合| 国产精品白丝jk白祙喷水网站 | 国产精品一卡二卡在线观看| 亚洲尤物在线视频观看| 日本一区免费视频| 欧美电影免费观看完整版| 欧洲中文字幕精品| 久久久国产精品麻豆 | 亚洲精品欧美激情| 国产天堂亚洲国产碰碰| 日韩一级片网址| 欧美三级日韩在线| 99精品欧美一区二区三区小说 | 日本成人在线电影网| 一区二区在线观看av| 国产精品国产自产拍高清av| 久久综合九色欧美综合狠狠| 欧美日韩国产区一| 日本精品一区二区三区高清| 国产成人鲁色资源国产91色综 | 日本欧美一区二区三区乱码| 亚洲自拍欧美精品| 成人欧美一区二区三区小说| 久久久99久久| 精品美女在线观看| 日韩女优av电影在线观看| 欧美日本韩国一区二区三区视频| 色综合久久综合| 91麻豆swag| 色一情一乱一乱一91av| 99久久综合99久久综合网站| 国产91精品免费|