實驗報告一 --詞法分析程序

實驗1、 詞法分析程序實驗數組

專業 計算機科學與技術   姓名 劉東  學號 201506110164函數

1、        實驗目的測試

  1. 編制一個詞法分析程序

2、        實驗內容和要求spa

  1. 輸入:源程序字符串
  2. 輸出:二元組(種別,單詞自己)
  3. 待分析語言的詞法規則

3、        實驗方法、步驟及結果測試設計

  1. 1.      源程序名:壓縮包文件(rarzip)中源程序名 cifafenxi.c

可執行程序名:cifafenxi.exeblog

  1. 2.      原理分析及流程圖

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

    doip

    {ci

           scanf("%s\n",input);字符串

           i=0;input

           while(input[i] !='\0')

           {

                  //printf("char=%c\n",input[i]);

                  if(input[i] == '+' || input[i] == '-' || input[i] == '*' || input[i] == '/' || input[i] == '=')       //對字符串中的表達式作分詞,並記錄相應運算符 

                  {

                         //printf("\nhello\n");

                         p=(NODE*)malloc(sizeof(NODE));

                         p->next=NULL;

                         p->string=(char*)malloc(sizeof(char)*2);

                         p->string[0]='\0';

                         strncpy(p->string,&input[i],1);

                         p->next=yunsuanfu->next;

                         yunsuanfu->next=p;

                  //     printf("yunsuanfu is %c\n",input[i]);

                  }

                  else if(ispunct(input[i]) && input[i] != '~')   //對字符串中出現界符的地方作分詞,並記錄相應界符

                  {

                         //ch=(char*)malloc(sizeof(NODE));

                         p=(NODE*)malloc(sizeof(NODE));

                         p->next=NULL;

                         p->string=(char*)malloc(sizeof(char)*2);

                         p->string[0]='\0';

                         strncpy(p->string,&input[i],1);

                         p->next=jiefu->next;

                         jiefu->next=p;

                  }

                  i++;

           }

           ch=strtok(input,delim);

           do

           {

                  if(input[0] =='~')

                         break;

                  q=head;

                  p=(NODE*)malloc(sizeof(NODE));

                  p->next=NULL;

                  p->string=(char*)malloc(sizeof(input));

                  p->string[0]='\0';

                  strcat(p->string,ch);           //鏈接先後字符串,合成新的字符串

                  while(q->next !=NULL)

                         q=q->next;

                  p->next=q->next;

                  q->next=p;

           }while(ch=strtok(NULL,delim));         

    }while(input[0] !='~');

 

                  if(strspn(p->string,biaowords))              //使用strspn()來對字符串中是否含有biaowords數組中的字符,如有則爲標識符

                  {

 

                                q->string=p->string;

                                q->next=biaoshi->next;

                                biaoshi->next=q;                            

                  }

 

 

  1. 4.      運行結果及分析

通常必須配運行結果截圖,結果是否符合預期及其分析。

   (截圖需根據實際,截取有表明性的測試例子)

 

實驗結果與預期基本吻合,可是在界符那裏會出現除界符之外其餘的字符,我認爲出現這一緣由是由於在複製字符串的時候多了複製了幾位,但修改後得出的結論並非這樣。

4、        實驗總結

本次實驗中我學會了如何經過C來寫鏈接多個任意長度的字符串並返回該字符串。本身動手寫了一個小型的分詞模塊,感受對功能設計的手段豐富了。其實後來我知道了這個詞法分析程序其實並不用作這麼多,但我真的經過此次的實驗嘗試了不少之前沒有想過的設計。

 

主要的設計問題有:

一、如何將各個字符串鏈接起來,使它變成一個新串。

二、如何區分標識符,界符和運算符

三、怎麼輸出結果

解決方法:

一、我使用動態數組來存儲可變長度的字符串,每次輸入一個字符竄後都會計算這個字符串的空間大小,並加上以前所有的空間大小來建立一個新的字符串,並使用strcmp()函數來複制先輸入的字符串。

二、我使用strspn()函數來匹配字符串中哪些是標識符。此前我對整個字符串作了一個分詞。

三、我是使用鏈表來記錄每個類別(如標識符、運算符、界符等)他們裏面分別有哪些字符串。

相關文章
相關標籤/搜索