自己動手寫basic直譯器 一

農村的房子發表於2018-11-13

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

自己動手寫basic直譯器

刺蝟@http://blog.csdn.net/littlehedgehog






注: 文章basic解釋原始碼摘自樑肇新先生的《程式設計高手箴言》(據他所說這個程式碼也是網上摘錄的),原始碼解讀參考《java程式設計藝術》。《java程式設計藝術》裡面自然是java版了(可能旭哥更加適合點兒),我這裡還是解讀的C版basic直譯器程式碼。



那些客套話我們就不扯那麼多了,啥寫編譯器是多少程式設計師夢想阿,多牛逼阿之類云云這之類的話我們就不聊了,主要是這裡是C(不是java),C程式沒java那麼多套路,直接單刀赴會了。


這個是我們要解釋的程式主幹原始碼,先不妨也看看。+點選瀏覽+



好了既然我們是寫basic直譯器,那我們至少先要明白兩件事情:第一,什麼是直譯器;第二,basic語法這個至少要了解大概吧。



第一,什麼是直譯器?


編譯器大家應該都知道,GCC,VC++(當然這個不純粹是編譯器了),簡單的說呢,編譯器將程式的原始碼轉化為可執行程式碼的形式。通常情況下,這種可執行程式碼由計算機的CPU指令組成,因此可以直接在計算機上執行。而直譯器就不同了,它順序讀入程式的原始碼,然後依次執行每一條語句。因此,直譯器並不真正將原始碼轉化為目的碼,而是直接執行程式。


第二,basic語法(以及我們為什麼選擇basic直譯器作為編寫目標)

先說第一個為什麼寫basic? 因為basic語法簡單,你聽名字也大概知道了,比如我不會選擇advance作為編寫目標,名字就比較嚇人。

basic我們不來詳細講了,因為我們做得這個直譯器本來就很小,沒涉及到多少東東,有需要的可以google一下。這裡先貼一小段程式碼,混個臉熟:


  1. PRINT "A Simple Small BASIC Program"   '列印字串

  2. FOR X = 1 TO 10   'for迴圈

  3. GOSUB 100   '跳到標號100 語句執行  注意這裡100是標號

  4. NEXT   '下一個x  表示x要加一

  5. END   ‘程式結束

  6. 100 PRINT X   '這裡相當於C中函式
  7. RETURN   '返回
程式碼一目瞭然,我們直譯器基本上也就處理這幾個關鍵字。現在擺在我們面前的就是如何處理這些關鍵字,換句話來說,我們如何在程式讀取到相應關鍵字時,做出相應反應了。比如 我們執行print,我們就要用printf把print後面的東東列印出來。這還比較好辦,但是如果是一個for迴圈呢,我們又該如何處理?


關鍵字處理是個大麻煩,因為我們面對不同關鍵字,要做出不同反應來。這個還是後話,眼前我們還是把主要框架先看看。


第一步  裝載原始碼

用過gcc麼?鬱悶 gcc都沒用過!看來在windows下生活滋潤慣了,學計算機還是要來open source陣營阿,話扯遠了。我們用gcc編譯c檔案時,都是gcc -o    target   source   。 所以我們也仿照這格式,直接用命令列 (圖形介面我們就不用實現了,再說俺也不懂)。


  1. main (int argc,char *argv[])
  2. {
  3.     char *p_buf;
  4.     char *t;

  5.     if (argc!=2)  {
  6.         printf ("usage: %s <filename>/n",argv[0]);
  7.         exit (1);
  8.     }

  9.     /* allocate memory for the program */
  10.     if (!(p_buf=(char *)malloc(PROG_SIZE)))  {
  11.         printf ("allocation failure");
  12.         exit (1);
  13.     }

  14.     /* load the program to execute */
  15.     if (!load_program(p_buf,argv[1]))  exit(1);
  16. }

這裡我們開闢一個PROG_SIZE大小空間,供裝載程式原始碼用。然後我們把程式程式碼用load_program函式裝入記憶體。程式碼如下:

  1. /* Load a program */
  2. load_program (char *p,char *fname)
  3. {
  4.     FILE *fp;
  5.     int i=0;
  6.    
  7.     if (!(fp=fopen(fname,"rb")))  return 0;

  8.     i=0;
  9.     do  {
  10.         *p = getc(fp);
  11.         p++;i++;
  12.     } while (!feof(fp)&&i<PROG_SIZE);
  13.     *(p-2) = '/0';   /* null terminate the program  */
  14.     fclose (fp);
  15.     return 1;
  16. }
程式碼很簡單。因為我們現在還沒有開始處理語法,下面才是正式開始。






           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述

相關文章