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

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

?? pl0_02.pas

?? 一個詞法分析器還有實驗的說明
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
                        (*pl0 compiler with code generation*)
{*****************************主程序*********************************0000}
program pl0(fa,fa1,fa2);

label 99;

const wordmax=13;     {of reserved words}
      idTbmax=100;    {length of identifier table}
      numbmax=14;     {max number of digits in numbers}
      idLength=10;    {length of identifiers}
      addrmax=2047;   {maximun address}
      levelmax=3;     {max depth of block nesting}
      codemax=200;    {size of code array}

type symbol = (nul,ident,number,
               plus,minus,times,slash,
               oddsym,eql,neq,lss,leq,gtr,geq,
               lparen,rparen,comma,semicolon,period,becomes,
               beginsym,endsym,
               ifsym,thensym,whilesym,
               writesym,readsym,dosym,callsym,
               constsym,varsym,procsym);
      alfa = packed array [1..idLength] of char;
      obj = (constant,variable,procedur);
      symset = set of symbol;
      fct = (lit,opr,lod,sto,cal,int,jmp,jpc);
      instruction = packed record
                      f : fct;
                      l : 0..levelmax;
                      a : 0..addrmax;
                    end;

var  fa,fa1,fa2 : text;
     listswitch : boolean;
  ch : char;
  sym : symbol;
  id : alfa;

  last_read_num : integer;   (* last number read*)
  char_count : integer;     (* character count *)
  line_length : integer;     (* line length *)
  kk: integer;
  code_index: integer;      (*code allocation index *)
  line: array[1..81] of char;
  a : alfa;
  code : array[0..codemax] of instruction;
  word : array[1..wordmax] of alfa;
  wsym : array[1..wordmax] of symbol;
  ssym : array[' '..'^'] of symbol;
  (* wirth uses "arry[char]" here*)
  mnemonic: array[fct] of packed array[1..5] of char;
  declbegsys , statbegsys , facbegsys: symset ;
  table: array[0..idTbmax] of record
                              name: alfa;
                              case kind : obj of
                              constant : (val:integer);
                              variable, procedur : (level,adr,size:integer)
                    (*"size" lacking in original. I think it belongs here*)
                            end;
  fin,fout:text;
  {fname:alfa;}
  fname:string;
  err:integer;

{出錯處理,打印出錯位置和錯誤編碼}
procedure error(n:integer);        {************************************1111}
 begin
  case n of
   1: writeln(fa,'Declare constant error,must be =,not := ', ' ' : char_count-1,'!',n:2);
   2: writeln(fa,'constant declaration ''='' must be followed by = ', ' ' : char_count-1,'!',n:2);
   3: writeln(fa,'constant identify must be followed by = ', ' ' : char_count-1,'!',n:2);
   4: writeln(fa,'must be identify followed by const,var,procedure',' ' : char_count-1,'!',n:2);
   5: writeln(fa,'maybe lost , or ;',' ',char_count-1,'!',n:2);
   6: writeln(fa,'lost begin string of statement or procedur define;',' ',char_count-1,'!',n:2);
   7: writeln(fa,'must be begin string of statement',' ',char_count-1,'!',n:2);
   8: writeln(fa,'statement''s following char is incorrect',' ',char_count-1,'!',n:2);
   9: writeln(fa,'must use . to end the program ',' ',char_count-1,'!',n:2);
   10:writeln(fa,'lost ; ',' ',char_count-1,'!',n:2);
   11:writeln(fa,'id maybe not defined ',' ',char_count-1,'!',n:2);
   12:writeln(fa,'Becomes''s left id must be var',' ',char_count-1,'!',n:2);
   13:writeln(fa,'var must followed by := in becomes statement ',' ',char_count-1,'!',n:2);
   14:writeln(fa,'call must be followed by id',' ',char_count-1,'!',n:2);
   15:writeln(fa,'call must be followed by proc id ',' ',char_count-1,'!',n:2);
   16:writeln(fa,'lost then ',' ',char_count-1,'!',n:2);
   17:writeln(fa,'lost end or ;',' ',char_count-1,'!',n:2);
   18:writeln(fa,'lost do in the while statement',' ',char_count-1,'!',n:2);
   19:writeln(fa,'statement followed by incorrect char',' ',char_count-1,'!',n:2);
   20:writeln(fa,'must be relation opr ',' ',char_count-1,'!',n:2);
   21:writeln(fa,'must not be var,not proc in the expression statement',' ',char_count-1,'!',n:2);
   22:writeln(fa,'lost ) ',' ',char_count-1,'!',n:2);
   23:writeln(fa,'factor followed by incorrect char ',' ',char_count-1,'!',n:2);
   24:writeln(fa,'expression begin char error',' ',char_count-1,'!',n:2);
   31:writeln(fa,'number out of ranger',' ',char_count-1,'!',n:2);
   32:writeln(fa,'read statement must be var in ()',' ',char_count-1,'!',n:2);
  end;
  err:=err+1   {?}
 end  (*error*);

{詞法分析,讀取一個單詞}
 procedure getsym;                   {************************************1111}
 var i,j,k:integer;


   procedure getch;                        {getch:過濾空格,讀取一個字符}
   begin
     if char_count=line_length then
       begin
         if eof(fin) then
           begin
             write('program incomplete');
             (********************************goto 99;*)
           end;
         line_length := 0;
         char_count := 0;
         write(code_index:4,' ');
         write(fa1,code_index:4,'');
         while not eoln(fin) do
           begin
	   line_length:=line_length+1;
	   read(fin,ch);
	   write(ch);
	   write(fa1,ch);
	   line[line_length]:=ch
           end;
         writeln;
         line_length:=line_length+1;
         read(fin,line[line_length]);
         writeln(fa1);
       end;
       char_count:=char_count+1;
       ch:=line[char_count]
   end(*getch*);

 begin(*getsym*)
   while ch in [' ',#13,#10] do getch;
   if ch in ['a'..'z'] then
     begin               (*id or reserved word*)

       k:=0;
       repeat
         if k<idLength then  {idLength=10}
           begin
             k:=k+1;
             a[k]:=ch
         end;
         getch;
       until not(ch in ['a'..'z','0'..'9']);

       if k>=kk
         then kk:=k
       else
         repeat
           a[kk]:=' ';
           kk:=kk-1
         until kk=k;

       id:=a;{get identify and store it into id }

       i:=1;
       j:=wordmax;{wordmax=13}
       repeat
         k:=(i+j)div 2;
         if id<=word[k] then j:=k-1;
         if id>=word[k] then i:=k+1
       until i>j;

       if i-1>j then sym:=wsym[k]   {reserved word}
       else sym:=ident              {identifier }

     end  {ch in a..z}

   else if ch in['0'..'9'] then
     begin(*number*)
       k := 0;
       last_read_num := 0;
       sym := number;
       repeat
         last_read_num := 10 * last_read_num + (ord(ch) - ord('0'));
         k := k+1;
         getch;
       until not(ch in['0'..'9']);

       if k > numbmax then error(30);
     end {ch in 0..9}

   else if ch=':' then
     begin
       getch;
       if ch='=' then
         begin
           sym:=becomes;
           getch;
         end
       else sym:=nul;
     end

   else if ch='<' then
     begin
       getch;
       if ch='=' then
         begin
           sym:=leq;
           getch
         end
       else sym:=lss
     end

   else if ch='>' then
     begin
       getch;
       if ch='=' then
         begin
           sym:=geq;
           getch
         end
       else sym:=gtr
     end

   else
     begin
       sym:=ssym[ch];
       getch
     end

 end(* getsym *);


{生成目標代碼,并送入目標程序區}
procedure gen(x:fct;y,z:integer);      {*********************************1111}
  begin
    if code_index > codemax then
      begin
        write('program too long');
        {goto 99}exit
      end;
      with code[code_index] do
        begin
          f:=x;
          l:=y;
          a:=z
        end;
        code_index:=code_index+1
      end(* gen *);

{測試當前單詞符號是否合法}
procedure test(s1,s2:symset;n:integer);  {*******************************1111}
 begin
  if not(sym in s1)
    then
     begin
        error(n);
        s1:=s1+s2;
        while not(sym in s1)do getsym
        end
       end(* test *);

{分程序分析處理過程:對程序的說明部分和程序主體部分分別進行處理}
procedure block(lev,tx:integer;fsys:symset);  {**************************1111}
var dx:integer;   (* data allocation index *)
   tx0:integer;   (* initial table index *)
   cx0:integer;   (* initial code  index*)


procedure enter(k:obj);                {enter:登錄名字表============2222}
begin (* enter object into table *)
  tx:=tx+1;
  with table[tx] do
  begin
     name:=id;
     kind:=k;
     case k of
      constant:begin
	  if last_read_num>addrmax
           then
	    begin
             error(31);
             last_read_num:=0;
	    end;
          val:=last_read_num
           end;
variable:begin
           level:=lev;
           adr:=dx;
           dx:=dx+1;
           end;
      procedur:level:=lev
        end
    end
end(* enter *);



function  position(id:alfa):integer;
                             {position:查找標識符在名字表中的位置==2222}
var i:integer;
begin (*find identifier in table *)
  table[0].name:=id;
  i:=tx;
  while table[i].name<>id do i:=i-1;
  position:=i;
end;(* position *)

procedure constdeclaration;  {constdeclaration:常量定義處理========2222}
begin
  if sym=ident then
  begin
    getsym;
    if sym in[eql,becomes] then
    begin
      if sym=becomes then error(1);
      getsym;
      if sym=number then
      begin
        enter(constant);
        getsym;
      end
      else error(2);
    end
    else error(3);
  end
  else error(4);
end;(*constdeclaration*)

procedure vardeclaration;    {vardeclaration:變量說明處理===========2222}
 begin
   if sym=ident then
    begin
     enter(variable);
     getsym
    end
   else error(4)
 end(*vardeclaration*);

procedure listcode;          {listcode:列目標代碼清單==============2222}
var i:integer;
begin  (*list code generated for this block*)
  if listswitch then
  begin
    for i:=cx0 to code_index-1 do
      with code[i] do
      begin
        writeln(fa,i:4,' ',mnemonic[f]:5,l:3,a:5)
      end;
  end;
end(*listcode*);

procedure statement(fsys:symset);
                             {=========statement:語句部分處理=====2222}
var i,cx1,cx2:integer;

procedure expression(fsys:symset);     {-----expression declare--}
var addop:symbol;

procedure term(fsys:symset);           {****term declare****}
var mulop:symbol;

procedure factor(fsys:symset);         {****factor declare*****}
var i:integer;
begin                              {****factor proceesing*****5555}
  test(facbegsys,fsys,24);
  while sym in facbegsys do
  begin
    if sym = ident then
    begin
      i := position(id);
      if i = 0 then
         error(11)
      else
        with table[i] do
        case kind of
          constant:gen(lit,0,val);
          variable:gen(lod,lev-level,adr);
          procedur:error(21);
        end;
      getsym;
    end
    else
    if sym=number then
    begin
      if last_read_num>addrmax then
      begin
        error(31);
        last_read_num:=0;
      end;
      gen(lit,0,last_read_num);
      getsym;
    end
    else
      if sym=lparen then
      begin
        getsym;
        expression([rparen]+fsys);
        if sym=rparen then getsym
        else error(22);
      end;
      test(fsys,facbegsys,23)
    end;
end(*factor*);

begin(*term*)                            {****term proceesing*****4444}
  factor([times,slash]+fsys);
  while sym in [times,slash] do
  begin
    mulop:=sym;
    getsym;
    factor(fsys+[times,slash]);
    if mulop=times then gen(opr,0,4)
    else gen(opr,0,5);
  end;
end(*term*);

begin                                  {----expression proceesing--3333}
  if sym in [plus,minus] then
  begin
    addop:=sym;
    getsym;
    term(fsys+[plus,minus]);

    if addop=minus then gen(opr,0,1)
  end
  else term(fsys+[plus,minus]);

  while sym in [plus,minus] do
  begin
    addop:=sym;
    getsym;
    term(fsys+[plus,minus]);
    if addop=plus then gen(opr,0,2)
    else gen(opr,0,3);
  end;
end(*expression*);

procedure condition(fsys:symset);      {---condition processing------3333}
var relop:symbol;
begin
  if sym=oddsym then
  begin
    getsym;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩亚洲国产综合| 亚洲色图欧美在线| 中文字幕一区二区不卡| 午夜视频在线观看一区二区| 日韩电影一区二区三区四区| 成人午夜在线播放| 日韩视频免费观看高清完整版在线观看 | 蜜臀av性久久久久蜜臀av麻豆 | 五月天久久比比资源色| 成人在线视频一区二区| 日韩天堂在线观看| 亚洲自拍欧美精品| 99re成人精品视频| 久久久蜜桃精品| 久久99久久精品欧美| 欧美日韩一区二区在线视频| 最新高清无码专区| 国产成人欧美日韩在线电影| 制服丝袜日韩国产| 午夜不卡在线视频| 欧美日韩中文字幕一区二区| 亚洲欧美日韩人成在线播放| 99久久婷婷国产综合精品| 26uuu精品一区二区| 美洲天堂一区二卡三卡四卡视频| 欧美精品黑人性xxxx| 亚洲成人精品一区二区| 日本电影欧美片| 亚洲精品视频在线看| youjizz久久| 国产精品久久国产精麻豆99网站| 国产一区二区三区蝌蚪| 精品成人私密视频| 久久99精品国产91久久来源| 日韩欧美色综合| 久久99九九99精品| 精品国产乱码久久久久久图片| 青椒成人免费视频| 欧美成人精精品一区二区频| 麻豆精品一区二区av白丝在线| 日韩视频中午一区| 国产一区二区在线影院| www成人在线观看| 国产专区综合网| 欧美国产国产综合| 一本大道久久a久久精二百| 亚洲精品视频在线| 欧美美女激情18p| 欧美96一区二区免费视频| 精品99999| 91精品一区二区三区在线观看| 午夜精品影院在线观看| 欧美一卡二卡三卡| 国产在线播放一区三区四| 国产婷婷一区二区| 日本韩国欧美国产| 日韩电影在线观看网站| 久久综合九色综合97婷婷| 国产一区二区不卡在线| 亚洲婷婷综合久久一本伊一区| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 91啪亚洲精品| 午夜影院久久久| 久久久国产精品麻豆| 91福利精品第一导航| 美腿丝袜在线亚洲一区 | 亚洲成年人影院| 精品国精品国产| 91色.com| 精品综合久久久久久8888| 国产精品久久久久久久久晋中 | 欧美性猛交xxxxxxxx| 久久av中文字幕片| 亚洲精品精品亚洲| 精品国产百合女同互慰| 色婷婷国产精品久久包臀 | 青青草97国产精品免费观看 | 亚洲国产中文字幕在线视频综合| 欧美一区二区三区免费在线看| 丁香婷婷深情五月亚洲| 午夜精品国产更新| 亚洲欧洲一区二区在线播放| 91久久香蕉国产日韩欧美9色| 美女网站色91| 亚洲午夜久久久久久久久电影院 | 亚洲精品高清在线观看| 欧美一级专区免费大片| 欧美在线一二三| 成人激情免费网站| 久久爱www久久做| 午夜免费欧美电影| 亚洲精品一二三四区| 国产精品每日更新| 欧美va亚洲va在线观看蝴蝶网| 91国偷自产一区二区开放时间| 国产一区美女在线| 精品亚洲免费视频| 日韩成人伦理电影在线观看| 亚洲精品视频在线| 亚洲欧美电影一区二区| 欧美激情在线看| 精品av综合导航| 日韩欧美一级二级| 日韩欧美你懂的| 日韩一级片网址| 91精品久久久久久久99蜜桃| 91福利视频网站| 在线亚洲精品福利网址导航| 成人激情小说网站| 成人短视频下载| 成人中文字幕在线| 国产精品69毛片高清亚洲| 激情五月婷婷综合网| 韩国女主播成人在线| 免费av网站大全久久| 青青国产91久久久久久| 人妖欧美一区二区| 久久99久久99小草精品免视看| 蜜桃一区二区三区在线观看| 青青草国产成人av片免费| 久久精品噜噜噜成人88aⅴ | 亚洲电影第三页| 亚洲电影一级片| 日本在线观看不卡视频| 免费国产亚洲视频| 国产乱人伦偷精品视频不卡| 国产在线麻豆精品观看| 国内精品伊人久久久久影院对白| 激情五月激情综合网| 国产成人亚洲精品青草天美| 成人精品视频一区二区三区尤物| 成人黄色国产精品网站大全在线免费观看| 国产不卡高清在线观看视频| av男人天堂一区| 在线观看日产精品| 91精品国产福利在线观看 | 色伊人久久综合中文字幕| 欧美无砖砖区免费| 欧美日韩国产高清一区二区三区 | 91免费观看在线| 欧美艳星brazzers| 日韩免费视频一区二区| 国产亚洲精品中文字幕| 亚洲乱码国产乱码精品精小说 | 成人av免费在线观看| 91丨porny丨蝌蚪视频| 欧美三级韩国三级日本三斤| 91麻豆精品国产91久久久资源速度| 日韩欧美一二三区| 中文字幕亚洲不卡| 日本亚洲三级在线| 成人aaaa免费全部观看| 欧美日韩一级视频| 久久精品亚洲精品国产欧美kt∨| 亚洲美女免费在线| 国产一区二三区| 色偷偷久久人人79超碰人人澡| 制服视频三区第一页精品| 中文字幕精品在线不卡| 日韩高清一级片| 99精品视频中文字幕| 91精品国产91久久久久久一区二区| 国产亚洲一二三区| 日日骚欧美日韩| 99这里只有精品| 日韩精品一区二区三区视频在线观看| 国产精品人人做人人爽人人添| 视频一区免费在线观看| 99麻豆久久久国产精品免费| 91精品国产免费久久综合| 一区二区三区国产精华| 国产成人av影院| 日韩美女主播在线视频一区二区三区| 亚洲三级电影全部在线观看高清| 日本中文字幕一区二区视频| 色婷婷亚洲综合| 国产精品久久久久久久久免费丝袜 | 日韩免费观看高清完整版| 一区二区视频在线| 国产超碰在线一区| 亚洲精品在线三区| 天堂蜜桃一区二区三区| 欧美亚日韩国产aⅴ精品中极品| 亚洲国产电影在线观看| 久久精品99久久久| 欧美一区2区视频在线观看| 一区二区久久久久| 99热99精品| 国产精品久久久久久久久图文区 | 国产精品美女久久久久av爽李琼| 久久99九九99精品| 欧美成人r级一区二区三区| 日韩高清不卡在线| 日韩精品中文字幕一区| 日本视频在线一区| 欧美一区二区视频在线观看| 五月天激情小说综合| 欧美精品丝袜久久久中文字幕| 亚洲国产你懂的| 欧美三级午夜理伦三级中视频|