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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? parser.pas

?? Draak is a multi-language, macro compiler, meaning all syntax and code generation is defined in a si
?? PAS
字號:
(* parser.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 parser;

interface

uses gmrdrv, filedrv, hashs, classes, error;

type
  PParseNode = ^RParseNode;
  RParseNode = record
    point: RHashNode;
    line: cardinal;
    children: array of PParseNode;
  end;

  PCardinal = ^cardinal;
  TString = class
   public
    f: TFile;
    buff: string;
    start: cardinal;
    FMax: PCardinal;
    lineNums: array of record line, char: cardinal; end;
    function getChar(i: Cardinal): char;
    function getMax: cardinal;
   public
    property b[Index: Cardinal]: char read getChar; default;
    property st: string read buff;
    property max: Cardinal read getMax;
    property char: Cardinal read start;
    constructor create(inF: TFile; startChar: cardinal; inB: string; inMax: PCardinal);
    function getNew(startChar: cardinal): TString;
    function len: cardinal;
    function lineFind(charNum: cardinal): cardinal;
    function copy(s, len: cardinal): string;
  end;

  TParser = class
    rootNode: PParseNode;
    err: TError;
    lines: cardinal;
    alphanum, numbers, hexs, bins, octs: set of char;
    procedure parse(inF: TFile; inG: TGmr);
    function parseDecent(inS: TString; inG: TGmr; inNode: RHashNode; out child: PParseNode): word;
  end;

implementation

uses sysutils, draak;

const buffStep = 2000;

function TString.getChar(i: cardinal): Char;
begin
  if i+start > length(buff) then result := #0
  else result := buff[i+start];
  if FMax^ < i+start then
    FMax^ := i+start;
end;
function TString.getMax: Cardinal;
begin
  result := FMax^;
end;
constructor TString.create(inF: TFile; startChar: cardinal; inB: string; inMax: PCardinal);
var a: string; i, o, buffLen: cardinal;
begin
  f := inF; start := startChar;
  if inB = '' then
  begin
    FMax := new(pcardinal);
    FMax^ := 0;
    setLength(lineNums, 1);
    lineNums[0].line := 0; lineNums[0].char := 0;
    o := 0; buffLen := 0;
    while inF.eof <> true do
    begin
      a := f.getLine;
      for i := 1 to length(a) do
      begin
        if i+o > buffLen then
        begin
          buffLen := buffLen+buffStep;
          setLength(buff, buffLen);
        end;
        buff[i+o] := a[i];
      end;
      o := o+length(a);
//      buff := buff+f.getLine;
      setLength(lineNums, length(lineNums)+1);
      lineNums[length(lineNums)-1].char := {length(buff)}o;
      lineNums[length(lineNums)-2].line := f.lineCount;
    end;
    lineNums[length(lineNums)-1].line := f.lineCount;
    setLength(buff, o);
  end else
  begin
    buff := inB;
    FMax := inMax;
  end;
end;
function TString.getNew(startChar: cardinal): TString;
begin
  result := TString.create(f, start+startChar-1, buff, FMax);
  result.lineNums := lineNums;
end;
function TString.lineFind(charNum: cardinal): cardinal;
var s, i: cardinal;
  old: array of boolean;
begin
  s := length(lineNums)-2; i := 0; setLength(old, length(lineNums));
  while not((lineNums[s].char <= charNum) AND (lineNums[s+1].char >= charNum)) do
  begin
    old[s] := true;
    s := trunc((charNum / lineNums[s+1].char) * (s+1));
    while (s > 0) and (old[s] = true) do dec(s);
    while (s < length(lineNums)) and (old[s] = true) do inc(s);
    inc(i); if i > length(lineNums) then raise EDraakNoCompile.Create('Can''t find error line');
  end;
  result := lineNums[s].line;
end;
function TString.len: cardinal;
begin
  result := length(buff)-start;
end;
function TString.copy(s, len: cardinal): string;
begin
  result := system.Copy(buff, start+s, len);
end;

procedure TParser.parse(inF: TFile; inG: TGmr);
var s: TString;
  i: word; Node: PParseNode;
  dumbHash: PHashNode;
begin
  lines := 0;
  s := TString.create(inF, 0, '', nil);
//  err.stream(s.copy(0, 1000));
  dumbHash := inG.getHashNode('<str>', hash('<str>'), 0);
  if dumbHash = nil then
    alphanum := ['A'..'Z', 'a'..'z', '0'..'9', '_']
  else
  begin
    alphanum := [];
    for i := 0 to length(dumbHash.RHS.terminal)-1 do
    begin
      alphanum := alphanum + [dumbHash.RHS.terminal[i]];
    end;
  end;
  dumbHash := inG.getHashNode('<num>', hash('<num>'), 0);
  if dumbHash = nil then
    numbers := ['0'..'9']
  else
  begin
    numbers := [];
    for i := 0 to length(dumbHash.RHS.terminal)-1 do
    begin
      numbers := numbers + [dumbHash.RHS.terminal[i]];
    end;
  end;
  dumbHash := inG.getHashNode('<hex>', hash('<hex>'), 0);
  if dumbHash = nil then
    hexs := ['0'..'9', 'A'..'F', 'a'..'f']
  else
  begin
    hexs := [];
    for i := 0 to length(dumbHash.RHS.terminal)-1 do
    begin
      hexs := hexs + [dumbHash.RHS.terminal[i]];
    end;
  end;
  dumbHash := inG.getHashNode('<oct>', hash('<oct>'), 0);
  if dumbHash = nil then
    octs := ['0'..'7']
  else
  begin
    octs := [];
    for i := 0 to length(dumbHash.RHS.terminal)-1 do
    begin
      octs := octs + [dumbHash.RHS.terminal[i]];
    end;
  end;
  dumbHash := inG.getHashNode('<bin>', hash('<bin>'), 0);
  if dumbHash = nil then
    bins := ['0'..'1']
  else
  begin
    bins := [];
    for i := 0 to length(dumbHash.RHS.terminal)-1 do
    begin
      bins := bins + [dumbHash.RHS.terminal[i]];
    end;
  end;
  i := parseDecent(s, inG, inG.getGoal, Node);
  lines := inF.lineCount;
  if i < s.len-1 then i := 0;
  if i = 0 then err.err('Did not Parse. Error around "'+s.copy(s.max-10, 20)+'" Line '+intToStr(s.lineFind(s.max)));
  if i <> 0 then rootNode := Node else Node := nil;
end;

function TParser.parseDecent(inS: TString; inG: TGmr; inNode: RHashNode; out child: PParseNode): word;
var dumbAtom, tempAtom: PHashAtom;
  tempNode: PHashNode;
  s: string; i, o, count: word;
  Node: PParseNode;
  partial: boolean;
begin
  err.newNode(inNode.name + '"' + inS.copy(0, 10) + '"');
  partial := false;
  child := new(PParseNode);
  setlength(child.children, 0);
  child.point := inNode;
  dumbAtom := innode.RHS; o := 1; result := 0;
  if (dumbAtom.term = nonTerminal) AND (string(dumbAtom.nonTerminal) = inNode.name) then
    raise EDraakNoCompile.Create('Infinate recursion on '+inNode.name);

  try
  while dumbAtom <> nil do
  begin
    if inS[1] = #0 then exit;
    if inS[o] = ' ' then inc(o);

    case dumbAtom.term of
     terminal:
      begin
        s := dumbAtom.terminal;
        for i := 1 to length(s) do
        begin
          if (inS[o] = ' ') AND (s[i] = ' ') then inc(o);
          if upcase(s[i]) <> upcase(inS[o]) then
            if s[i] = ' ' then continue
            else exit;
          inc(o);
        end;
        err.addNode(dumbAtom.terminal);
        partial := true;
      end;
     id:
      begin
        i := o;
        if inS[i] in numbers then exit;
        while inS[i] in alphanum do inc(i);
        s := inS.copy(o, i-o);
        tempNode := inG.getHashNode('<id>', hash('<id>'), 0);
        if tempNode <> nil then
        begin
          tempAtom := tempNode^.RHS;
          while tempAtom <> nil do
          begin
            if Ansipos(' '+s+' ', tempAtom.terminal) <> 0 then
            begin
              err.addNode('<id> ' + s + '!!!');
              result := 0; exit;
            end;
            tempAtom := tempAtom.next;
          end;
        end;
        err.addNode('<id> ' + s);
        Node := new(PParseNode);
        tempNode := new(PHashNode);
        tempNode.name := s;
        tempNode.Macros := nil;
        tempNode.special := true;
        Node.point := tempNode^;
        setLength(Node.children, 0);
        finalize(tempNode^);
        o := i;
      end;
     str:
      begin
        if inS[o] <> '''' then exit;
        i := o+1;
        while (inS[i] <> '''') AND (i < inS.len) do
        if (inS[i+1] = '''') AND (inS[i+2] = '''') then
        begin {delete(inS, i+1, 1);} inc(i, 3); end
        else inc(i);
        if o = inS.len then exit;
        s := inS.copy(o+1, i-o-1);
        count := AnsiPos('''''', s);
        while count <> 0 do
        begin
          delete(s, count, 1); count := AnsiPos('''''', s);
        end;
        Node := new(PParseNode);
        tempNode := new(PHashNode);
        tempNode.name := s;
        tempNode.special := true;
        Node.point := tempNode^;
        finalize(tempNode^);
        o := i+1;
      end;
     num:
      begin
        if (not(inS[o] in numbers) AND (inS[o] <> '-')) OR (o = inS.len) then exit;
        i := o;
        if inS[i] = '-' then inc(i);
        while inS[i] in numbers do inc(i);
        s := inS.copy(o, i-o);
        Node := new(PParseNode);
        tempNode := new(PHashNode);
        tempNode.name := s;
        tempNode.Macros := nil;
        tempNode.special := true;
        Node.point := tempNode^;
        finalize(tempNode^);
        o := i;
      end;
     hex:
      begin
        if (not(inS[o] in hexs) OR (o = inS.len)) then exit;
        i := o;
        while inS[i] in hexs do inc(i);
        s := inS.copy(o, i-o);
        Node := new(PParseNode);
        tempNode := new(PHashNode);
        tempNode.name := s;
        tempNode.Macros := nil;
        tempNode.special := true;
        Node.point := tempNode^;
        finalize(tempNode^);
        o := i;
      end;
     oct:
      begin
        if (not(inS[o] in octs) OR (o = inS.len)) then exit;
        i := o;
        while inS[i] in octs do inc(i);
        s := inS.copy(o, i-o);
        Node := new(PParseNode);
        tempNode := new(PHashNode);
        tempNode.name := s;
        tempNode.Macros := nil;
        tempNode.special := true;
        Node.point := tempNode^;
        finalize(tempNode^);
        o := i;
      end;
     bin:
      begin
        if (not(inS[o] in bins) OR (o = inS.len)) then exit;
        i := o;
        while inS[i] in bins do inc(i);
        s := inS.copy(o, i-o);
        Node := new(PParseNode);
        tempNode := new(PHashNode);
        tempNode.name := s;
        tempNode.Macros := nil;
        tempNode.special := true;
        Node.point := tempNode^;
        finalize(tempNode^);
        o := i;
      end;
     nonterminal:
      begin
        count := 0;
        tempNode := inG.getHashNode(dumbAtom.nonTerminal, dumbAtom.hashCode, count);
        if tempNode = nil then
        begin
          err.err('No such Non-terminal: ' + dumbAtom.nonTerminal);
          exit;
        end;
        while tempNode <> nil do
        begin
          i := parseDecent(inS.getNew(o), inG, tempNode^, Node);
          if i = 0 then {Try next option}
          begin
            inc(count);
            tempNode := inG.getHashNode(dumbAtom.nonTerminal, dumbAtom.hashCode, count);
            if (tempNode = nil) AND (dumbAtom.optional = false) then exit;
            if tempNode = nil then node := nil;
            continue;
          end else
          begin {That option was a winner}
            o := o + i;
            if dumbAtom.star = true then
            begin
              setLength(child^.children, length(child^.children)+1);
              child^.children[length(child^.children)-1] := Node;
              count := 0;
              tempNode := inG.getHashNode(dumbAtom.nonTerminal, dumbAtom.hashCode, count);
              continue;
            end;
            break;
          end;
        end;
      end;
    end;
    if (dumbAtom.term <> terminal) {AND (Node <> nil)} then with child^ do
    begin
      setLength(children, length(children)+1);
      children[length(children)-1] := Node;
      child.line := inS.lineFind(inS.char+o);
    end;
    dumbAtom := dumbAtom.next;
  end;
  result := o-1;
  finally begin
    if result = 0 then err.popNode('!!!') else err.popNode('');
    if (partial = true) AND (result = 0) then {err('Danger Will Robinson, Danger ' + inNode.name)}; { $ENDIF}
  end; end;
end;

{* So what does parser do exactly?  Easy, it is in charge of taking a source  *}
{* file, a grammer and building a parse tree of rules.                        *}

initialization
begin
//  alphanum := ['A'..'Z', 'a'..'z', '0'..'9', '_'];
//  numbers := ['0'..'9'];
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲精品一区| 久久精品一区蜜桃臀影院| 欧美一区二视频| 国产精品理论在线观看| 日韩精品一二区| 色综合久久久久综合| 精品美女被调教视频大全网站| 亚洲视频1区2区| 国产精一区二区三区| 欧美日韩一级黄| 国产精品电影一区二区| 蜜臀久久99精品久久久画质超高清| 91麻豆swag| 欧美激情在线看| 国内一区二区在线| 欧美一区二区三区不卡| 综合色天天鬼久久鬼色| 国产传媒欧美日韩成人| 日韩免费观看高清完整版在线观看| 亚洲中国最大av网站| 99久久久久久| 国产嫩草影院久久久久| 国产老妇另类xxxxx| 欧美一区二区国产| 视频一区二区三区中文字幕| 欧美无砖专区一中文字| 亚洲九九爱视频| 91一区二区在线| 中文字幕一区二区三| 国产99精品在线观看| 国产片一区二区三区| 久久精品国产精品亚洲精品| 日韩视频一区二区三区在线播放 | 国产成人丝袜美腿| 精品欧美一区二区久久| 麻豆精品一区二区综合av| 欧美高清一级片在线| 午夜不卡av免费| 欧美一级理论片| 久久国产尿小便嘘嘘尿| 日韩精品一区在线观看| 精品亚洲国产成人av制服丝袜| 精品处破学生在线二十三| 国产麻豆视频一区| 欧美韩日一区二区三区四区| 白白色 亚洲乱淫| 亚洲色图欧美激情| 精品视频1区2区| 日本不卡视频一二三区| 精品欧美久久久| 成人免费高清在线观看| 亚洲欧美色图小说| 欧美精品一级二级| 久久精品国内一区二区三区| 国产午夜亚洲精品不卡| 成人av网址在线| 亚洲一二三四在线| 欧美一区二区三区在线观看视频 | 中文字幕不卡的av| 色哟哟一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了 | 国产一区二区三区在线观看精品| 国产亚洲短视频| 97精品久久久久中文字幕| 亚洲一区二区欧美日韩| 欧美一卡在线观看| 国产大片一区二区| 亚洲一本大道在线| 久久综合久久99| 色94色欧美sute亚洲线路二| 日本欧美在线看| 中文字幕不卡三区| 欧美精品一级二级| www.亚洲人| 久久国产婷婷国产香蕉| 最新国产成人在线观看| 日韩精品在线一区| 在线观看日韩一区| 国产乱人伦偷精品视频免下载| 亚洲毛片av在线| ww久久中文字幕| 欧美四级电影网| 成人在线综合网站| 蜜臀av亚洲一区中文字幕| 中文字幕一区二区三区蜜月 | 亚洲一区二区三区四区五区黄| 26uuu久久天堂性欧美| 精品视频在线免费观看| 成人午夜精品一区二区三区| 蜜桃视频第一区免费观看| 日韩理论片在线| 欧美国产精品劲爆| 日韩一区二区电影| 欧美日韩国产首页在线观看| 99久久99久久精品免费观看| 国产精品一区在线观看乱码| 日韩精品一级二级| 一区二区免费看| ●精品国产综合乱码久久久久 | 中文一区一区三区高中清不卡| 91精品国产一区二区三区| 色综合久久久久综合体桃花网| 岛国一区二区三区| 国产一区在线观看视频| 欧美aa在线视频| 亚洲6080在线| 亚洲国产美女搞黄色| 亚洲精品高清在线| 亚洲免费观看高清完整| 中文字幕国产一区二区| 国产肉丝袜一区二区| 2023国产精品| 久久久久久久久久久久久久久99| 欧美成人精品福利| 日韩视频不卡中文| 日韩欧美在线综合网| 欧美一区二区三区免费大片| 91精品国产黑色紧身裤美女| 7777精品伊人久久久大香线蕉完整版| 欧美午夜一区二区三区免费大片| 欧美专区亚洲专区| 精品视频在线视频| 欧美一区二区二区| 精品国产污网站| 中文字幕不卡在线| 综合av第一页| 亚洲午夜免费视频| 天天综合色天天综合色h| 日本成人在线不卡视频| 麻豆极品一区二区三区| 国产精品一区免费视频| 大桥未久av一区二区三区中文| 99精品国产99久久久久久白柏| 一本色道久久综合狠狠躁的推荐| 欧洲视频一区二区| 日韩一级二级三级精品视频| 久久嫩草精品久久久久| 国产精品三级电影| 亚洲已满18点击进入久久| 五月天视频一区| 国产自产高清不卡| 成人久久18免费网站麻豆| 色综合久久综合| 日韩一区二区免费在线观看| 国产日韩影视精品| 一区二区三区在线观看网站| 午夜精彩视频在线观看不卡| 狠狠色狠狠色综合日日91app| 成人午夜视频在线| 欧美视频在线一区二区三区| 精品久久久久久亚洲综合网| 中文字幕在线一区免费| 午夜精品视频在线观看| 国产精品一二三四区| 欧美自拍偷拍午夜视频| 26uuu色噜噜精品一区| 综合激情成人伊人| 麻豆成人av在线| 91精品福利视频| 久久婷婷国产综合精品青草| 亚洲一区在线视频| 成人中文字幕在线| 3d动漫精品啪啪1区2区免费 | 日韩午夜中文字幕| 国产精品福利一区二区| 免费高清视频精品| 日本乱码高清不卡字幕| 久久久久久久久蜜桃| 婷婷久久综合九色综合伊人色| 成人免费观看视频| 日韩欧美二区三区| 依依成人综合视频| 国产精品影视网| 日韩视频免费观看高清完整版 | 日本在线播放一区二区三区| jlzzjlzz欧美大全| 久久久综合九色合综国产精品| 午夜精品福利久久久| 91麻豆swag| 中文字幕字幕中文在线中不卡视频| 激情六月婷婷久久| 欧美日韩免费电影| 亚洲美女淫视频| 波多野结衣精品在线| 国产亚洲欧美日韩在线一区| 日本不卡123| 欧美久久免费观看| 亚洲激情在线播放| 91在线无精精品入口| 中文字幕电影一区| 国产剧情av麻豆香蕉精品| 精品久久一二三区| 久久精品国产亚洲5555| 日韩精品中文字幕一区二区三区 | 日韩久久一区二区| 国产91在线观看| 国产视频一区在线播放| 国产一区二区视频在线| 精品久久国产97色综合| 美女视频一区二区三区|