⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cifafenxi.~pas

📁 delphi编的pl0编译器
💻 ~PAS
字号:
unit CiFaFenXi;

interface
uses
  SysUtils;

procedure CreateWordList(var now_order:integer);

implementation
uses
  Defination;




procedure getsym;
label iiii;
var
  k:integer;
  i:integer;

begin
iiii:
  if ch='\' then
  begin
    while ch<>chr(13) do
    begin
      if ch<>chr(26) then read(fin,ch)
      else
      begin
        ch_endflag:=chr(26);
        exit;
      end;
    end;
  end;

  while ((ch=chr(13))or(ch=chr(9))or(ch=chr(10))or(ch=' '))do  //滤去space,enten
  begin                                                        //Tab
    if ch=chr(13) then inc(line_index);      //行号加
    read(fin,ch);
  end;

  if ch='{' then
  begin
    while ch<>'}' do
    begin
      read(fin,ch);
      if ch=chr(13) then
        inc(line_index);
    end;
    read(fin,ch);
    goto iiii;
  end;


  if ch='\' then goto iiii;


  if (ch in ['a'..'z']) or (ch in ['A'..'Z']) then
  begin
    k:=0;
    repeat
      if k<AL then
      begin
        inc(k);
        akk[k]:=ch;
      end;

      read (fin,ch);

    until not(ch in['a'..'z','0'..'9']);
    if k>=kk then kk:=k
    else
      repeat
        akk[kk]:=' ';
        dec(kk)
      until kk=k;

    id:=akk;
    word_index:=WORDLISTLENTH;

    keyword[0]:=id;
    while(id<>keyword[word_index]) do
      dec(word_index);

    if(word_index=0) then
    begin
      word_index:=888;
    end;
  end
  else if ch in['0'..'9'] then
  begin
    num:=0;
    repeat
      num:=10*num+(ord(ch)-ord('0'));
      read(fin,ch);
    until not (ch in ['0'..'9']);
    word_index:=999;

    for i:=1 to 5 do id[i]:='$';
    for i:=6 to 10 do id[i]:=' ';
  end

  else if ch=':' then
  begin
    read(fin,ch);
    if ch='=' then
    begin
      id[1]:=':';
      id[2]:='=';
      for k:=3 to 10 do id[k]:=' ';
      word_index:=17;
      read(fin,ch);
    end
    else
    begin
      id[1]:=':';
      for k:=2 to 10 do id[k]:=' ';
      word_index:=31;
    end;
  end
  else if ch='<' then
  begin

    read(fin,ch);
    if ch='=' then
    begin
      id[1]:='<';
      id[2]:='=';
      for k:=3 to 10 do id[k]:=' ';
      word_index:=19;
      read(fin,ch);
    end
    else
    begin
      id[1]:='<';
      for k:=2 to 10 do id[k]:=' ';
      word_index:=18;
    end;
  end
  else if ch='>' then
  begin
    read(fin,ch);
    if ch='=' then
    begin
      id[1]:='>';
      id[2]:='=';
      for k:=3 to 10 do id[k]:=' ';
      word_index:=22;
      read(fin,ch);
    end
    else
    begin
      id[1]:='>';
      for k:=2 to 10 do id[k]:=' ';
      word_index:=21;
    end;
  end
  else
  begin
    akk[1]:=ch;
    for k:=2 to 10 do akk[k]:=' ';

    id:=akk;
    word_index:=29;
    keyword[0]:=id;
    while(id<>keyword[word_index]) do
      dec(word_index);

    read(fin,ch);
  end;

end;



procedure CreateWordList(var now_order:integer);
var
  order:integer;
  var_no:integer;

  temp_name:alfa;
  temp_no:integer;
  temp_value:integer;
begin
  chdir('C:\');
  assignfile(fin,'temporary_source_word.txt');
  reset(fin);
  
  var_no:=0;

  getsym;

  while ch_endflag<>chr(26) do    //ch_endflag为ch的前一个字符,为结束符结束
  begin
    temp_value:=0;
    temp_name:=id;
    order:=now_order;

    temp_no:=0;
    if word_index=888 then
    begin
      wordlist[0].name:=id;
      wordlist[0].index:=888;

      while(id<>wordlist[order].name) do dec(order);
      if (order=0) then
      begin
        temp_no:=var_no+1;
        inc(var_no);
      end
      else
      begin
        temp_no:=wordlist[order].no;
      end;
    end;

    if word_index=999 then
      temp_value:=num;

    inc(now_order);
    wordlist[now_order].name:=temp_name;
    wordlist[now_order].index:=word_index;
    wordlist[now_order].no:=temp_no;
    wordlist[now_order].value:=temp_value;
    wordlist[now_order].info:=line_index;

    if wordlist[now_order].index<(WORDLISTLENTH+10) then
    begin
      wordlist[now_order].symb_string:=ssym_string[wordlist[now_order].index];
      wordlist[now_order].symb:=ssym[wordlist[now_order].index];
    end;

    if wordlist[now_order].index=888 then
    begin
      wordlist[now_order].symb_string:='ident';
      wordlist[now_order].symb:=ident;
    end;
    if wordlist[now_order].index=999 then
    begin
      wordlist[now_order].symb_string:='number';
      wordlist[now_order].symb:=number;
    end;
    ch_endflag:=ch;
    getsym;
  end;
//////////////////////////////////////////////////////////////////////
  if wordlist[now_order].name[1]=chr(26) then //滤去最后的enter符
    dec(now_order);

  closefile(fin);
  deletefile('temporary_source_word.txt');
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -