實驗報告一 詞法分析程序


實驗一  詞法分析實驗

專業:商業軟件工程     姓名:陳冠中    學號:201506110195

一、        實驗目的

  詞法分析程序完成的是編譯第一階段的工作。詞法分析工作是把字符流的源程序變為單詞序列,輸出到一個中間文件,這個文件作為語法分析程序的輸入而繼續編譯過程。而該實驗就是設計一個簡單的詞法分析程序,通過編制一個程序來完成轉換。

 

二、        實驗內容和要求

實驗要求:

1.輸入:源程序字符串

2.輸出:二元組(種別,單詞符號本身)

實驗內容:

對字符串表示的源程序

從左到右進行掃描和分解

根據詞法規則,識別出一個個具有獨立意義的單詞符號以供語法分析之用

發現詞法錯誤,則返回出錯信息

三、        實驗方法、步驟及結果測試

1.詞法分析程序.c

詞法分析程序.exe

 

2.原理分析及流程圖

從錄入程序字符串,調用scaner函數 ,讀取字符串中的數據,通過判斷空格或回車前的單元,進行詞法分析,最后以二元組形式輸出。

 

3.主要程序段及其解釋:

void scaner()

 { 

       sum=0;

    for(m=0;m<8;m++)

        t[m++]=NULL;

    ch=c[p++];

    m=0;

    while((ch==' ')||(ch=='\n'))

    ch=c[p++];

    if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

      {

      while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

      {

                t[m++]=ch;

          ch=c[p++];

      }

      p--;

      s=10;

//這段代碼是在輸入一段源程序后,程序對於里面數字和英文單獨判斷,輸出s。

t[m++]=’\0’;

//這里是程序在輸入后的字符串進行確定,不進行操作會使程序出錯,在輸出過程中進行隨意分配。

      for(n=0;n<6;n++)

    if(strcmp(t,w[n])==0)

       {

              s=n+1;

         break;

       }

      }

    else if((ch>='0')&&(ch<='9'))

      {

              while((ch>='0')&&(ch<='9'))

              { sum=sum*10+ch-'0';

          ch=c[p++];

              }

    p--;

s=11;

//在對輸入的源程序判斷時,輸入的不在范圍的程序段時,輸出s

      }

    else switch(ch)

    {

     case '<':t[m++]=ch;

          ch=c[p++];

                 if(ch=='>')

            {  s=22;

               t[m++]=ch;

            }

          else

            {

                       s=20;

               p--;

                }

              if(ch=='=')

            {  s=21;

               t[m++]=ch;

            }

                      

          break;

     case '>':t[m++]=ch;

          ch=c[p++];

          if(ch=='=')

            { s=24;

              t[m++]=ch;

            }

          else

            { s=23;

              p--;

            }

          break;

     case '+': s=13;

             t[m++]=ch;

             break;

 

     case '-':

            s=14;

            t[m++]=ch; 

          break;

 

     case '!':ch=c[p++];

          if(ch=='=')

           { s=30;

             t[m++]=ch;

           }

          else

          { s=31;

             p--;

          }

          break;

 

     case '=':

            s=25;

            t[m++]=ch;

            break;

 

     case '*': s=15;

           t[m++]=ch;        

                 break;

 

     case '/': s=16;

           t[m++]=ch;

           break;

     case '(': s=27;

           t[m++]=ch;

           break;

     case ')': s=28;

           t[m++]=ch;

           break;

     case '{': s=5;

           t[m++]=ch;

           break;

     case '}': s=6;

           t[m++]=ch;

           break;

     case ';': s=26;

          t[m++]=ch;

          break;

     case '\"': s=32;

           t[m++]=ch;

           break;

     case '#': s=0;

           t[m++]=ch;

           break;

     case ':':t[m++]=ch;

          ch=c[p++];

           if(ch=='=')

            {  s=18;

               t[m++]=ch;

            }

                 else

          { s=17;

             p--;

                }

           break;

    default: s=-1;

         break;

       }

          t[m++]='\0';

  }

 

4.運行結果及分析

 

 

四、        實驗總結

在看到詞法分析這個實驗時,對於詞法分析的這個含義還不是很清楚,對於老師布置這個作業的意義也不清楚。在看到書上對於詞法分析的講解時,才明白詞法分析是整個編譯的第一階段工作,可以說好的詞法分析程序會讓之后的編譯工作變得更輕松。在參考了一些詞法分析程序后,對於詞法分析程序中的側重點也有所了解,特別是對於一段源程序的存儲與判斷,最后與種別表進行相應的對比,這是簡單的詞法分析過程。在自己實現這個代碼時,印象最深的是在對於分界符的判斷時,在兩個以上的一起判斷時,就會出現單個分界符的錯誤輸出,在經過一系列的錯誤嘗試后,最后正確輸出。可以說這個詞法分析程序結合許多不同的方法,最終得到的簡單可行的程序。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM