2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩10頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  《編譯原理》</b></p><p>  實(shí)驗(yàn)報(bào)告 </p><p>  二○一八年 一 月 二 日</p><p><b>  目錄</b></p><p><b>  一、實(shí)驗(yàn)?zāi)康模?</b></p>&

2、lt;p><b>  二、實(shí)驗(yàn)要求:1</b></p><p>  三、詞法分析程序的算法思想:2</p><p><b>  四、程序代碼:3</b></p><p><b>  五、結(jié)果分析:7</b></p><p><b>  六、總結(jié):8&l

3、t;/b></p><p><b>  一、實(shí)驗(yàn)?zāi)康模?</b></p><p>  根據(jù)詞法分析器的基本原理,設(shè)計(jì)、編制并調(diào)試一個(gè)詞法分析程序,加深對(duì)詞法分析原理的理解。</p><p><b>  二、實(shí)驗(yàn)要求:</b></p><p>  2.1詞法分析器:逐個(gè)讀入源程序字符并按照構(gòu)詞規(guī)

4、則切分成一系列單詞。單詞是語言中具有獨(dú)立意義的最小單位,包括保留字、標(biāo)識(shí)符、運(yùn)算符、標(biāo)點(diǎn)符號(hào)和常量等。詞法分析是編譯過程中的一個(gè)階段,在語法分析前進(jìn)行 。也可以和語法分析結(jié)合在一起作為一遍,由語法分析程序調(diào)用詞法分析程序來獲得當(dāng)前單詞供語法分析使用。 要求:通過詞法分析器能夠?qū)崿F(xiàn)以下五種類型如單詞等的識(shí)別。 </p><p>  (1)關(guān)鍵字"begin",&qu

5、ot;end","if","then","else","while","write","read"等, </p><p>  "do", "call","const","char",&q

6、uot;until","procedure","repeat"等 </p><p>  (2)運(yùn)算符:"+","-","*","/","="等 </p><p>  (3)界符:"{","}&

7、quot;,"[","]",";",",",".","(",")",":"等 </p><p>  (4)標(biāo)識(shí)符   (其他單詞是標(biāo)識(shí)符(ID)和整型常數(shù)(SUM),通過以下正規(guī)式定義:</p><p>

8、;  ID = letter (letter | digit)*</p><p>  NUM = digit digit*</p><p><b>  (5)常量</b></p><p>  如果關(guān)鍵字、標(biāo)識(shí)符和常數(shù)之間沒有確定的算符或界符作間隔,則至少</p><p>  用一個(gè)空格作間隔??崭裼煽瞻?、制表符和換行符組

9、成。</p><p>  2.2 各種單詞符號(hào)對(duì)應(yīng)的種別碼:</p><p>  2.3 詞法分析程序的功能:</p><p>  輸入:所給文法的源程序字符串。</p><p>  輸出:二元組(syn,token或sum)構(gòu)成的序列。</p><p>  其中:syn為單詞種別碼;</p><p

10、>  token為存放的單詞自身字符串;</p><p><b>  sum為整型常數(shù)。</b></p><p>  例如:對(duì)源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,經(jīng)過詞法分析后輸出如下序列:</p><p>  (1,begin)(10,x)(18,:=)(11,9)(2

11、6,;)(2,if)……</p><p>  三、詞法分析程序的算法思想:</p><p>  算法的基本任務(wù)是從字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào),其基本思想是根據(jù)掃描到單詞符號(hào)的第一個(gè)字符的種類,拼出相應(yīng)的單詞符號(hào)。</p><p>  3.1主程序示意圖:</p><p>  主程序示意圖如圖所示。其中初始包括以下兩個(gè)方面

12、:</p><p> ?、?關(guān)鍵字表的初值。</p><p>  關(guān)鍵字作為特殊標(biāo)識(shí)符處理,把它們預(yù)先安排在一張表格中(稱為關(guān)鍵字表),當(dāng)掃描程序識(shí)別出標(biāo)識(shí)符時(shí),查關(guān)鍵字表。如能查到匹配的單詞,則該單詞為關(guān)鍵字,否則為一般標(biāo)識(shí)符。關(guān)鍵字表為一個(gè)字符串?dāng)?shù)組,其描述如下:</p><p>  Char *rwtab[6] = {“begin”, “if”, “then”

13、, “while”, “do”, “end”,};</p><p> ?。?)程序中需要用到的主要變量為syn,token和sum</p><p>  3.2 掃描子程序的算法思想:</p><p>  首先設(shè)置3個(gè)變量:①token用來存放構(gòu)成單詞符號(hào)的字符串;②sum用來整型單詞;③syn用來存放單詞符號(hào)的種別碼。掃描子程序主要部分流程如圖所示</p>

14、;<p><b>  四、程序代碼:</b></p><p>  #include <stdio.h></p><p>  #include <string.h></p><p>  #include<conio.h></p><p>  #include <pro

15、cess.h></p><p>  char prog[80],token[8],ch;</p><p>  int syn,p,m,n,sum;</p><p>  char *rwtab[6]={"begin","if","then","while","do"

16、;,"end"};</p><p><b>  scaner();</b></p><p><b>  main()</b></p><p><b>  {p=0;</b></p><p>  printf("\n please input a s

17、tring(end with '#'):/n");</p><p><b>  do{</b></p><p>  scanf("%c",&ch);</p><p>  prog[p++]=ch;</p><p>  }while(ch!='#');&

18、lt;/p><p><b>  p=0;</b></p><p><b>  do{</b></p><p><b>  scaner();</b></p><p>  switch(syn)</p><p>  {case 11:printf("

19、( %-10d%5d )\n",sum,syn);</p><p><b>  break;</b></p><p>  case -1:printf("you have input a wrong string\n");</p><p><b>  getch();</b></p>

20、;<p><b>  exit(0);</b></p><p>  default: printf("( %-10s%5d )\n",token,syn);</p><p><b>  break;</b></p><p><b>  }</b></p>

21、<p>  }while(syn!=0);</p><p><b>  getch();</b></p><p><b>  }</b></p><p><b>  scaner()</b></p><p><b>  { sum=0;</b>

22、;</p><p>  for(m=0;m<8;m++)token[m++]=NULL;</p><p>  ch=prog[p++];</p><p><b>  m=0;</b></p><p>  while((ch==' ')||(ch=='\n'))ch=prog[p++]

23、;</p><p>  if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))</p><p>  { while(((ch<='z')&&(ch>='a'))||(

24、(ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))</p><p>  {token[m++]=ch;</p><p>  ch=prog[p++];</p><p><b>  }</b&

25、gt;</p><p><b>  p--;</b></p><p><b>  syn=10;</b></p><p>  for(n=0;n<6;n++)</p><p>  if(strcmp(token,rwtab[n])==0)</p><p>  { syn

26、=n+1;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  else if((ch>='0')&&(ch<='9')

27、)</p><p>  { while((ch>='0')&&(ch<='9'))</p><p>  { sum=sum*10+ch-'0';</p><p>  ch=prog[p++];</p><p><b>  }</b></p&

28、gt;<p><b>  p--;</b></p><p><b>  syn=11;</b></p><p><b>  }</b></p><p>  else switch(ch)</p><p>  { case '<':token[

29、m++]=ch;</p><p>  ch=prog[p++];</p><p>  if(ch=='=')</p><p>  { syn=22;</p><p>  token[m++]=ch;</p><p><b>  }</b></p><p>

30、<b>  else</b></p><p>  { syn=20;</p><p><b>  p--;</b></p><p><b>  }</b></p><p><b>  break;</b></p><p>  ca

31、se '>':token[m++]=ch;</p><p>  ch=prog[p++];</p><p>  if(ch=='=')</p><p><b>  { syn=24;</b></p><p>  token[m++]=ch;</p><p>&

32、lt;b>  }</b></p><p><b>  else</b></p><p><b>  { syn=23;</b></p><p><b>  p--;</b></p><p><b>  }</b></p>&

33、lt;p><b>  break;</b></p><p>  case '+': token[m++]=ch;</p><p>  ch=prog[p++];</p><p>  if(ch=='+')</p><p><b>  { syn=17;</b>&

34、lt;/p><p>  token[m++]=ch;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  { syn=13;</b></p><p><b>  p--;</b&g

35、t;</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case '-':token[m++]=ch;</p><p>  ch=prog[p++];</p><p>  if(ch=='-&

36、#39;)</p><p><b>  { syn=29;</b></p><p>  token[m++]=ch;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  { syn=

37、14;</b></p><p><b>  p--;</b></p><p><b>  }</b></p><p><b>  break;</b></p><p>  case '!':ch=prog[p++];</p><p

38、>  if(ch=='=')</p><p><b>  { syn=21;</b></p><p>  token[m++]=ch;</p><p><b>  }</b></p><p><b>  else</b></p><p&

39、gt;<b>  { syn=31;</b></p><p><b>  p--;</b></p><p><b>  }</b></p><p><b>  break;</b></p><p>  case '=':token[m++]

40、=ch;</p><p>  ch=prog[p++];</p><p>  if(ch=='=')</p><p><b>  { syn=25;</b></p><p>  token[m++]=ch;</p><p><b>  }</b></p&

41、gt;<p><b>  else</b></p><p><b>  { syn=18;</b></p><p><b>  p--;</b></p><p><b>  }</b></p><p><b>  break;<

42、;/b></p><p>  case '*': syn=15;</p><p>  token[m++]=ch;</p><p><b>  break;</b></p><p>  case '/': syn=16;</p><p>  token[m++

43、]=ch;</p><p><b>  break;</b></p><p>  case '(': syn=27;</p><p>  token[m++]=ch;</p><p><b>  break;</b></p><p>  case ')

44、': syn=28;</p><p>  token[m++]=ch;</p><p><b>  break;</b></p><p>  case '{': syn=5;</p><p>  token[m++]=ch;</p><p><b>  break

45、;</b></p><p>  case '}': syn=6;</p><p>  token[m++]=ch;</p><p><b>  break;</b></p><p>  case ';': syn=26;</p><p>  token[

46、m++]=ch;</p><p><b>  break;</b></p><p>  case '\"': syn=30;</p><p>  token[m++]=ch;</p><p><b>  break;</b></p><p>  ca

47、se '#': syn=0;</p><p>  token[m++]=ch;</p><p><b>  break;</b></p><p>  case ':':syn=17;</p><p>  token[m++]=ch;</p><p><b>

48、;  break;</b></p><p>  default: syn=-1;</p><p><b>  break;</b></p><p><b>  }</b></p><p>  token[m++]='\0';</p><p><

49、;b>  }</b></p><p><b>  五、結(jié)果分析:</b></p><p>  輸入begin y:=8: if x>=8 then x:=2*(1+1/3); end # </p><p>  經(jīng)詞法分析輸出如下序列:(begin 1)(y 10)(:17)(= 18)(8 11)(;26)(if

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論