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

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  課程設(shè)計(jì)任務(wù)書(shū)及成績(jī)?cè)u(píng)定</p><p> 課程設(shè)計(jì)的任務(wù)和具體要求設(shè)計(jì)任務(wù)選擇一種常見(jiàn)高級(jí)語(yǔ)言為背景,對(duì)其進(jìn)行簡(jiǎn)化,設(shè)計(jì)一個(gè)簡(jiǎn)單的c編譯器。例如只包括整型常數(shù)和其四則運(yùn)算以及相應(yīng)的賦值語(yǔ)句,轉(zhuǎn)移語(yǔ)句,條件語(yǔ)句和最簡(jiǎn)單的輸入輸出語(yǔ)句等.編制一個(gè)包括必要處理階段(詞法分析、語(yǔ)法分析、語(yǔ)義分析、代碼生成)簡(jiǎn)化又完整的編譯程序。設(shè)計(jì)要求寫(xiě)出符合分析方法要求的文法,給出分析方法的思想,完成分析程序設(shè)

2、計(jì);編制好分析程序后,設(shè)計(jì)若干用例,上機(jī)測(cè)試并通過(guò)所設(shè)計(jì)的分析程序。指導(dǎo)教師簽字: 日期: </p><p> 指導(dǎo)教師評(píng)語(yǔ)成績(jī): 指導(dǎo)教師簽字: 日期: </p><p> 課程設(shè)計(jì)所需軟件、硬件等PC機(jī)

3、Microsoft Visual C++6.0</p><p> 課程設(shè)計(jì)進(jìn)度計(jì)劃</p><p> 起至日期工作內(nèi)容備注</p><p> 2010.5.1---2010.5.152010.5.16---2010.6.12010.6.2---2010.6.15收集資料編寫(xiě)代碼運(yùn)行、調(diào)試</p><p> 參考文獻(xiàn)、資料索引</p>

4、;<p> 序號(hào)文獻(xiàn)、資料名稱(chēng)編著者出版單位</p><p> 1 程序設(shè)計(jì)語(yǔ)言編譯原理 陳火旺、劉春林等 國(guó)防工業(yè)出版社2 數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版) 嚴(yán)蔚敏、吳偉民 清華大學(xué)出版社3 C程序設(shè)計(jì) 譚浩強(qiáng) 清華大學(xué)出版社4 程序設(shè)計(jì)語(yǔ)言編譯方法 肖軍模

5、 大連理工大學(xué)出版社</p><p><b>  目 錄</b></p><p>  課程設(shè)計(jì)的任務(wù)和具體要求................................1</p><p>  課程設(shè)計(jì)進(jìn)度計(jì)劃........................................2</p><p

6、>  目錄....................................................3</p><p><b>  正文</b></p><p>  1、設(shè)計(jì)題目………………………………………………………… 4</p><p>  2 、 算法設(shè)計(jì)的思想………………………………………………4</p>

7、;<p>  3 、 算法設(shè)計(jì)分析…………………………………………………5</p><p>  4、 源代碼…………………………………………………………6</p><p>  5 、 運(yùn)行結(jié)果分析…………………………………………………6</p><p>  結(jié)束語(yǔ)………………………………………………………………20</p><p&

8、gt;<b>  正文</b></p><p><b>  1、設(shè)計(jì)題目</b></p><p>  一個(gè)簡(jiǎn)單編譯器的設(shè)計(jì)與分析</p><p><b>  2、算法設(shè)計(jì)的思想</b></p><p>  編譯程序的工作過(guò)程一般可以分為五個(gè)階段:詞法分析、語(yǔ)法分析、語(yǔ)義分析與中

9、間代碼產(chǎn)生、優(yōu)化、目標(biāo)代碼生成。每一個(gè)階段在功能上是相對(duì)獨(dú)立的,它一方面從上一個(gè)階段獲取分析的結(jié)果來(lái)進(jìn)行分析,另一方面由將結(jié)果傳遞給下一個(gè)階段。由編譯程序的五個(gè)階段就對(duì)應(yīng)了編譯系統(tǒng)的結(jié)構(gòu)。</p><p>  其中詞法分析器利用超前搜索、狀態(tài)轉(zhuǎn)換等方法,將源程序轉(zhuǎn)化成為一個(gè)一個(gè)的單詞符號(hào)二元式。一般程序語(yǔ)言的單詞符號(hào)包括關(guān)鍵字、運(yùn)算符、常數(shù)、標(biāo)識(shí)符和界符。語(yǔ)法分析器將這些單詞符號(hào)作為輸入,對(duì)它進(jìn)行語(yǔ)法分析。語(yǔ)法分

10、析分為兩種方法:自上而下分析法和自下而上分析法。針對(duì)不同程序語(yǔ)言的語(yǔ)法規(guī)則可以采取不同的分析方法,當(dāng)然兩種方法也可以同時(shí)使用。語(yǔ)法分析器把語(yǔ)法單元作為輸入供語(yǔ)義分析器使用。一般的語(yǔ)義分析器主要采用的是語(yǔ)法制導(dǎo)方法,即在語(yǔ)法分析的同時(shí)進(jìn)行語(yǔ)法分析,并產(chǎn)生一定的語(yǔ)義動(dòng)作,來(lái)生成中間代碼。上面三個(gè)過(guò)程可以與硬件無(wú)關(guān),而接下來(lái)的優(yōu)化器和目標(biāo)代碼生成器是針對(duì)某一種處理器而言的。代碼優(yōu)化是將語(yǔ)義分析生成的中間代碼進(jìn)行優(yōu)化,產(chǎn)生執(zhí)行效率更高的代碼。目

11、標(biāo)代碼生成器最終生成可以在某種機(jī)器上運(yùn)行的機(jī)器語(yǔ)言或者匯編語(yǔ)言。在整個(gè)編譯過(guò)程中還包括對(duì)表格的操作和對(duì)錯(cuò)誤的處理,這些也都是非常重要的環(huán)節(jié)。</p><p>  下圖給出了編譯系統(tǒng)的結(jié)構(gòu)框圖:</p><p><b>  3、算法設(shè)計(jì)分析</b></p><p>  使用的數(shù)據(jù)結(jié)構(gòu)和關(guān)鍵變量</p><p>  stru

12、ct Stack { // 棧結(jié)構(gòu)體: 序號(hào)、內(nèi)容、連接下一結(jié)點(diǎn)指針</p><p><b>  int num;</b></p><p>  char name;</p><p>  struct Stack *next;</p><p><b>  };</b></p><

13、;p>  struct Guiyue { // 規(guī)則集結(jié)構(gòu)體:序號(hào)、規(guī)則長(zhǎng)度、符號(hào)、連接下一結(jié)點(diǎn)指針</p><p><b>  int num;</b></p><p>  int count;</p><p>  char name;</p><p>  struct Guiyue *next;</p&g

14、t;<p><b>  };</b></p><p>  struct Relation { // 分析表結(jié)構(gòu)體:狀態(tài)序號(hào)、對(duì)應(yīng)符號(hào)列、操作類(lèi)型的對(duì)應(yīng)序號(hào)、操作類(lèi)型、連接下一結(jié)點(diǎn)指針</p><p>  int line_States ;</p><p>  char rank_Letter;</p><p&g

15、t;  int relationship;</p><p>  char name;</p><p>  struct Relation *next;</p><p><b>  };</b></p><p>  struct Sign { // 符號(hào)表結(jié)構(gòu)體: 自變量名、標(biāo)識(shí)類(lèi)型、連接下一結(jié)點(diǎn)指針</p>

16、<p>  char name[20];</p><p>  char kind;</p><p>  struct Sign *next;</p><p><b>  };</b></p><p>  struct Word { // 單詞表結(jié)構(gòu)體: 單詞名字、標(biāo)識(shí)類(lèi)型、狀態(tài)、序號(hào)、行號(hào)、連接符號(hào)表指針、連

17、接下一結(jié)點(diǎn)指針</p><p>  char name[20];</p><p>  char mark_name;</p><p>  int state;</p><p><b>  int num;</b></p><p><b>  int line;</b><

18、/p><p>  struct Sign *link;</p><p>  struct Word *next;</p><p><b>  };</b></p><p>  FILE *fp1, fp2; // 文件指針</p><p>  int row = 1; // 字符行變量<

19、;/p><p>  int line[10000], Lin[300]; // 字符行</p><p>  int w_num; // 單詞所在行、字符數(shù)</p><p>  char buffer[10000]; // 字符串緩沖區(qū)</p><p>  struct Word *head,*find; // 單詞表結(jié)構(gòu)體頭指針&l

20、t;/p><p>  struct Relation *r_head; // 分析表結(jié)構(gòu)體頭指針</p><p>  struct Guiyue *g_head; // 規(guī)約集結(jié)構(gòu)體頭指針</p><p>  struct Stack *s_head; // 棧結(jié)構(gòu)體頭指針</p><p><b>  主要功能函數(shù)簡(jiǎn)述&

21、lt;/b></p><p>  以下是實(shí)現(xiàn)的主要功能函數(shù)的信息簡(jiǎn)述,具體實(shí)現(xiàn)請(qǐng)參看六、源代碼</p><p>  int judge(char ch) </p><p>  功能:接收ch判斷字符,變量flag返回字符類(lèi)別</p><p>  void scan() </p><p>  功能:掃描輸入源文

22、件,并生成單詞種別碼</p><p>  struct Word *InitWord()</p><p>  功能:包括分割單詞、標(biāo)識(shí)單詞、生成變量符號(hào)表、完善單詞屬性表</p><p>  int ResultAnely(Relation* r_head,Stack *s_head, char str[], Guiyue *g_head, int cal)<

23、/p><p><b>  功能:詞法分析函數(shù)</b></p><p>  int ResultAnely(Relation *r_head,Stack *s_head,char str[],Guiyue *g_head,int cal)</p><p><b>  功能:語(yǔ)法分析函數(shù)</b></p><p&

24、gt;  void ProduceStyle(char str[], int order_num)</p><p>  功能:算術(shù)表達(dá)式四元式函數(shù)</p><p>  void BoolStyle(char str[], int order_num)</p><p>  功能:布爾表達(dá)式四元式函數(shù)</p><p>  void FourSt

25、yle(int goon, Word *head)</p><p>  功能:顯示四元式函數(shù)</p><p>  Stack *MarkPush(Stack *ip,char mark,int I_i)</p><p><b>  功能:進(jìn)棧</b></p><p>  void MarkPop(Stack *ip)&l

26、t;/p><p><b>  功能:出棧</b></p><p>  void FindWordDeclare(Word *head)</p><p>  功能:正確性檢測(cè)函數(shù),查找保留字是否被聲名和符號(hào)是否對(duì)稱(chēng)</p><p>  Relation *FirstRelation()</p><p>

27、  功能:初始化分析表函數(shù)</p><p>  Guiyue *FirstGuiyue()</p><p>  功能:初始化規(guī)則表函數(shù)</p><p><b>  4、主要源代碼:</b></p><p>  int judge(char ch) // 接收ch判斷字符,變量flag返回字符類(lèi)別</p>

28、<p><b>  {</b></p><p><b>  int flag;</b></p><p>  if(ch=='!'||ch=='$'||ch=='&'||ch=='*'||ch=='('||ch==')'||ch==&

29、#39;-'||ch=='_'||</p><p>  ch=='+'||ch=='='||ch=='|'||ch=='{'||ch=='}'||ch=='['||ch==']'||ch==';'||</p><p>  ch=='

30、:'||ch=='"'||ch=='<'||ch==','||ch=='>'||ch=='.'||ch=='/'||ch=='\'') </p><p><b>  flag=1;</b></p><p>  else

31、 if('0'<=ch&&ch<='9') </p><p><b>  flag=2;</b></p><p>  else if(('a'<=ch&&ch<='z')||('A'&

32、lt;=ch&&ch<='Z')) </p><p><b>  flag=3;</b></p><p>  else if(ch==' ') </p><p><b>  flag=4;</b>

33、</p><p>  else if(ch=='\n') </p><p><b>  flag=5;</b></p><p>  else if(ch=='?') </p&

34、gt;<p><b>  flag=6;</b></p><p>  else if(feof(fp1))</p><p>  flag=7;//結(jié)束</p><p>  else </p><p>  flag=0

35、; //illegal character</p><p>  return(flag);</p><p><b>  }</b></p><p>  void scan()</p><p><b>  {</b></p><p><b>  char c

36、h;</b></p><p>  int flag,j=0,i=-1;</p><p>  while(!feof(fp1)) {</p><p>  ch=fgetc(fp1);</p><p>  flag=judge(ch);</p><p>  printf("%c",ch);/

37、/顯示打開(kāi)的文件</p><p>  if(flag==1||flag==2||flag==3) {i++;buffer[i]=ch;line[i]=row;}</p><p>  else if(flag==4) {i++;buffer[i]='?';line[i]=row;}</p><p>  else i

38、f(flag==5) {i++;buffer[i]='~';row++;}</p><p>  else if(flag==7) continue;</p><p>  else cout<<"\n請(qǐng)注意,第"<<row<< "行的"<<ch<&

39、lt;"是非法字符!"<<endl; </p><p>  } </p><p><b>  w_num=i;</b></p><p><b>  //初始化關(guān)系表</b></p><p>

40、;  for(int i=0;i<84;i++){</p><p>  for(int j=0;j<cal[i];j++){</p><p>  r_new=(Relation *)malloc(sizeof(Relation));</p><p>  if(r_head==NULL){</p><p>  r_find=r_he

41、ad=r_new;</p><p><b>  }</b></p><p>  r_new->line_States=i;</p><p>  r_new->rank_Letter=Let[i][j];</p><p>  r_new->relationship=sr[i][j];</p>

42、<p>  r_new->name=SS[i][j];</p><p>  r_find->next=r_new;</p><p>  r_find=r_new;</p><p>  r_new->next=NULL;</p><p><b>  }</b></p><p

43、><b>  }</b></p><p>  return r_head;</p><p><b>  }</b></p><p>  Guiyue *FirstGuiyue(){</p><p>  Guiyue *g_head,*g_find,*g_new;</p><

44、;p>  g_head=NULL;</p><p><b>  //規(guī)約</b></p><p>  char root[]=</p><p>  {'B','Q','S','A','A','C','C','X'

45、,'Y','Y','Y','Y','Z','Z','S','S','S','E','E','H',</p><p>  'H','G','G','G','

46、;G','G','G','G','L','L','I','I','K','K','T','T','F','F','F'};</p><p><b>  int LR[]=&l

47、t;/b></p><p>  {1,7,3,2,1,3,1,2,1,1,1,1,3,1,11,7,4,3,1,3,1,3,3,3,3,3,2,1,3,1,3,1,3,1,3,1,3,1,1};</p><p><b>  //初始化規(guī)則表</b></p><p>  for(int i=0;i<39;i++){</p>

48、<p>  g_new=(Guiyue *)malloc(sizeof(Guiyue));</p><p>  if(g_head==NULL){</p><p>  g_find=g_head=g_new;</p><p><b>  }</b></p><p>  g_new->num=i;<

49、;/p><p>  g_new->count=LR[i];</p><p>  g_new->name=root[i];</p><p>  g_find->next=g_new;</p><p>  g_find=g_new;</p><p>  g_new->next=NULL;</p&g

50、t;<p><b>  }</b></p><p>  return g_head;</p><p><b>  }</b></p><p>  int ResultAnely(Relation *r_head,Stack *s_head,char str[],Guiyue *g_head,int cal)

51、{</p><p>  Relation *r_find;</p><p>  Guiyue *g_find;</p><p>  Stack *s_find;</p><p>  //Stack *s_look;</p><p>  s_find=s_head;</p><p>  int a

52、dmition=1,goon=1,in,out=1,hang=-1,count;</p><p>  //char stack[200];</p><p>  char name;</p><p>  //cout<<"\n===================顯--示--語(yǔ)--法--分--析--過(guò)--程--及--結(jié)--果==========

53、========="<<endl;</p><p>  //cout<<" LineNum StackData inputSentence\n"<<endl;</p><p>  while(goon){//:1</p><p>  int

54、admit=1;</p><p>  r_find=r_head;</p><p>  g_find=g_head;</p><p><b>  hang++;</b></p><p>  while(r_find&&admit){//:2</p><p>  if(r_find-

55、>line_States==s_find->num&&r_find->rank_Letter==str[0]&&r_find->name=='s'){//:入棧</p><p>  s_find=MarkPush(s_find,str[0],r_find->relationship);</p><p><b

56、>  admit=0;</b></p><p>  for(in=0;in<cal-1;in++){str[in]=str[in+1];}</p><p>  str[in]='\0';</p><p><b>  cal--;</b></p><p>  r_find=r_fin

57、d->next;</p><p><b>  }//:入棧~</b></p><p>  if(r_find->line_States==s_find->num&&r_find->rank_Letter==str[0]&&r_find->name=='r'){//:規(guī)約</p>

58、<p>  g_find=g_head;</p><p>  int g=r_find->relationship;</p><p>  while(g) {g_find=g_find->next;g--; }</p><p>  name=g_find->name;</p><p>  count=g_find

59、->count;</p><p><b>  admit=0;</b></p><p>  for(int k=0;k<count;k++){</p><p>  MarkPop(s_find);</p><p><b>  }</b></p><p>  r_f

60、ind=r_head;</p><p><b>  int a=1;</b></p><p>  while(r_find&&a){</p><p>  if(r_find->line_States==s_find->num && r_find->rank_Letter==name){</

61、p><p>  s_find=MarkPush(s_find,name,r_find->relationship);</p><p><b>  a=0;</b></p><p><b>  }</b></p><p>  r_find=r_find->next;</p>&

62、lt;p><b>  }</b></p><p><b>  }//:規(guī)約~</b></p><p>  if(r_find->line_States==s_find->num&&r_find->rank_Letter==str[0]&&r_find->name=='o'

63、;){//:2判斷運(yùn)算結(jié)束</p><p><b>  admit=0;</b></p><p><b>  goon=0;</b></p><p><b>  out=0;</b></p><p>  cout<<"\nSuccess !"&l

64、t;<endl;</p><p>  return(1);</p><p><b>  }</b></p><p>  r_find=r_find->next;</p><p><b>  }</b></p><p>  if(admit==1){ //判斷輸

65、入流是否正確,如在分析表中找不到關(guān)系,則輸入流錯(cuò)誤</p><p><b>  goon=0;</b></p><p>  cout<<"\nInput Flow Error !"<<endl;</p><p>  return(0);</p><p><b>  }

66、</b></p><p><b>  }</b></p><p>  cout<<"\n****************************************\n"<<endl;</p><p>  return 242424;</p><p><b

67、>  }</b></p><p>  void ProduceStyle(char str[],int order_num){</p><p>  struct FourStyle{</p><p>  char Word,Opr1,Opr2,Result;</p><p><b>  int num;</b

68、></p><p>  struct FourStyle *next;</p><p><b>  };</b></p><p>  struct Stack *stack_a,*stack_b;</p><p>  char temp;</p><p>  struct FourStyle

69、 *f_head,*f_find,*f_new;</p><p>  stack_a=(struct Stack *)malloc(sizeof(struct Stack));</p><p>  stack_a->name='$';</p><p>  stack_a->next=NULL;</p><p>  

70、stack_b=(struct Stack *)malloc(sizeof(struct Stack));</p><p>  stack_b->name='#';</p><p>  stack_b->next=NULL;</p><p>  f_head=NULL;</p><p>  int admit,ca

71、l,four;</p><p>  four=1;// 四元式序號(hào)</p><p><b>  cal=0;</b></p><p><b>  admit=1;</b></p><p>  while(admit){</p><p>  if(str[cal]=='

72、='){</p><p>  stack_a=MarkPush(stack_a,str[cal],cal);</p><p><b>  cal++;</b></p><p><b>  }</b></p><p>  else if(stack_b->name=='#'

73、;||stack_b->name=='+'||stack_b->name=='-'||stack_b->name=='*'||stack_b->name=='/')</p><p><b>  {</b></p><p>  if((str[cal]>='a'

74、)&&(str[cal]<='z')||(str[cal]>='0')&&(str[cal]<='9')){</p><p>  stack_a=MarkPush(stack_a,str[cal],cal);</p><p><b>  cal++;</b></p&

75、gt;<p><b>  }</b></p><p>  else if(str[cal]=='('){</p><p>  stack_b=MarkPush(stack_b,'#',cal);</p><p><b>  cal++;</b></p><p

76、><b>  }</b></p><p>  else if((stack_b->name=='#')&&(str[cal]=='+'||str[cal]=='-'||str[cal]=='*'||str[cal]=='/')){</p><p>  stack

77、_b=MarkPush(stack_b,str[cal],cal);</p><p><b>  cal++;</b></p><p><b>  }</b></p><p>  else if((stack_b->name=='#')&&(str[cal]==')')

78、){</p><p>  MarkPop(stack_b);</p><p><b>  cal++;</b></p><p><b>  }</b></p><p>  else if((stack_b->name=='#')&&(str[cal]=='

79、;;')){</p><p><b>  admit=0;</b></p><p><b>  }</b></p><p>  else if(stack_b->name=='+'||stack_b->name=='-'||stack_b->name=='*

80、'||stack_b->name=='/'){</p><p>  if((stack_b->name=='+'||stack_b->name=='-')&&(str[cal]=='*'||str[cal]=='/')){</p><p>  stack_b=MarkP

81、ush(stack_b,str[cal],cal);</p><p><b>  cal++;</b></p><p><b>  }</b></p><p><b>  else{</b></p><p>  if(f_head==NULL){</p><

82、p>  f_new=(struct FourStyle *)malloc(sizeof(struct FourStyle));</p><p>  f_find=f_new;</p><p>  f_head=f_find;</p><p><b>  }</b></p><p><b>  else{&

83、lt;/b></p><p>  f_new=(struct FourStyle *)malloc(sizeof(struct FourStyle));</p><p>  f_find->next=f_new;</p><p>  f_find=f_new;</p><p>  f_new->next=NULL;</

84、p><p><b>  }</b></p><p>  f_new->num=order_num;</p><p>  f_new->Word=stack_b->name;</p><p>  MarkPop(stack_b);</p><p>  f_new->Opr2=st

85、ack_a->name;</p><p>  MarkPop(stack_a);</p><p>  f_new->Opr1=stack_a->name;</p><p>  MarkPop(stack_a);</p><p>  temp=four+65;</p><p>  f_new->R

86、esult=temp;</p><p>  stack_a=MarkPush(stack_a,f_new->Result,cal);</p><p><b>  four++;</b></p><p><b>  }</b></p><p><b>  }</b><

87、/p><p><b>  }</b></p><p>  if(cal!=3&&admit==0&&str[cal]==';'){</p><p>  f_new=(struct FourStyle *)malloc(sizeof(struct FourStyle));</p><

88、p>  f_new->num=order_num;</p><p>  f_new->Opr1=stack_a->name;</p><p>  MarkPop(stack_a);</p><p>  f_new->Word=stack_a->name;</p><p>  MarkPop(stack_a)

89、;</p><p>  f_new->Opr2='_';</p><p>  f_new->Result=stack_a->name;</p><p>  MarkPop(stack_a);</p><p>  f_find->next=f_new;</p><p>  f_fi

90、nd=f_new;</p><p>  f_new->next=NULL;</p><p><b>  four++;</b></p><p><b>  }</b></p><p>  else if(cal==3&&admit==0&&str[cal]==&

91、#39;;'){</p><p>  f_new=(struct FourStyle *)malloc(sizeof(struct FourStyle));</p><p>  f_new->num=order_num;</p><p>  f_new->Opr1=stack_a->name;</p><p>  M

92、arkPop(stack_a);</p><p>  f_new->Word=stack_a->name;</p><p>  MarkPop(stack_a);</p><p>  f_new->Opr2='_';</p><p>  f_new->Result=stack_a->name;&l

93、t;/p><p>  f_head=f_new;</p><p>  f_new->next=NULL;</p><p><b>  four++;</b></p><p><b>  }</b></p><p><b>  }</b></p&g

94、t;<p>  f_find=f_head;</p><p>  while(f_find){</p><p>  /*cout.width(20);*/cout<<f_find->num<<": ( "<<f_find->Word<<" "<<f_find-&

95、gt;Opr1<<" "<<f_find->Opr2<<" "<<f_find->Result<<" )"<<endl;</p><p>  f_find=f_find->next;</p><p><b>  }</b&

96、gt;</p><p><b>  }</b></p><p>  void BoolStyle(char str[],int order_num){</p><p>  struct FourStyle{</p><p>  char Word,Opr1,Opr2;</p><p>  int

97、Order,num;</p><p>  struct FourStyle *next;</p><p><b>  };</b></p><p>  struct FourStyle *b_head,*b_find,*b_new,*p[100];</p><p>  b_head=NULL;</p>&l

98、t;p>  int cal,admit,i=0;</p><p><b>  admit=1;</b></p><p><b>  cal=0;</b></p><p>  while(admit){</p><p>  if(str[cal]!='|'&&st

99、r[cal]!='&'){</p><p>  if(b_head==NULL){</p><p>  b_find=b_new=(struct FourStyle *)malloc(sizeof(struct FourStyle));</p><p>  b_head=b_find;</p><p>  p[i]=b

100、_find;</p><p><b>  i++;</b></p><p><b>  }</b></p><p><b>  else{</b></p><p>  b_new=(struct FourStyle *)malloc(sizeof(struct FourStyl

101、e));</p><p>  p[i]=b_new;i++;</p><p>  b_find->next=b_new;</p><p>  b_find=b_new;</p><p>  b_new->next=NULL;</p><p><b>  }</b></p>

102、<p>  b_new->Opr1=str[cal];cal++;</p><p>  b_new->Word=str[cal];cal++;</p><p>  b_new->Opr2=str[cal];cal++;</p><p>  b_new->num=order_num;</p><p>  b_

103、new->Order=0;</p><p>  b_new=(struct FourStyle *)malloc(sizeof(struct FourStyle));</p><p>  p[i]=b_new;i++;</p><p>  b_new->Opr1='_';</p><p>  b_new->W

104、ord='j';</p><p>  b_new->Opr2='_';</p><p>  b_new->num=order_num;</p><p>  b_new->Order=0;</p><p>  b_find->next=b_new;</p><p>

105、  b_find=b_new;</p><p>  b_new->next=NULL;</p><p><b>  }</b></p><p>  else if(str[cal]=='|'){</p><p>  p[i-1]->Order=p[i-1]->num+1;</p&g

106、t;<p><b>  cal++;</b></p><p><b>  }</b></p><p>  else if(str[cal]=='&'){</p><p>  p[i-2]->Order=p[i-2]->num+2;</p><p>&

107、lt;b>  cal++;</b></p><p><b>  }</b></p><p>  if(str[cal]=='$'){</p><p><b>  admit=0;</b></p><p>  p[0]->Order=order_num;<

108、/p><p>  p[i-2]->Order=p[i-2]->num+2;</p><p>  if(str[cal-4]=='&'){</p><p>  p[i-1]->Order=p[i-3]->num;</p><p><b>  }</b></p>&l

109、t;p><b>  }</b></p><p><b>  }</b></p><p>  b_find=b_head;</p><p>  while(b_find){</p><p>  cout<<b_find->num<<": ( "

110、<<b_find->Word<<" "<<b_find->Opr1<<" "<<b_find->Opr2<<" "<<b_find->Order<<" )"<<endl;</p><p>  b_f

111、ind=b_find->next;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void Print(int t,Word *head,FILE *fp,Relation *r_head){</p><p>  struct Word *

112、w_look;</p><p>  struct Sign *s_look;</p><p>  struct Relation *r_new;</p><p><b>  int i=0;</b></p><p>  switch(t){</p><p><b>  case 1:&l

113、t;/b></p><p><b>  {</b></p><p>  cout<<endl<<"==========輸--入--流--轉(zhuǎn)--義--表============="<<endl;</p><p>  w_look=head;</p><p>  

114、while(w_look){</p><p>  if(i==30) {cout<<" "<<w_look->mark_name<<endl;i=0;}</p><p>  else {cout<<" "<<w_look->mark_name;i++;}</p>

115、<p>  w_look=w_look->next;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case 2:</b>&l

116、t;/p><p><b>  { </b></p><p>  cout<<endl<<"==========詞--法--分--析--過(guò)--程--及--結(jié)--果============="<<endl;</p><p>  w_look=head;</p><p> 

117、 cout<<"WordNumber WordLine WordName WordMark"<<endl;</p><p>  while(w_look){</p><p>  cout<<" "<<w_look->num<<"\t\t&quo

118、t;<<w_look->line<<"\t\t"<<w_look->name<<"\t\t"<<w_look->mark_name<<endl;</p><p>  w_look=w_look->next;</p><p><b>  }<

119、;/b></p><p>  cout<<"WordNumber WordLine WordName WordMark"<<endl;</p><p>  cout<<"\n=========================================================

120、====\n"<<endl;</p><p>  cout<<endl<<"======自--變--量--符--號(hào)--表========"<<endl;</p><p>  s_look=head->link;</p><p>  cout<<"DataType

121、"<<" "<<"SignName";</p><p>  while(s_look){</p><p>  cout<<" "<<s_look->kind<<"\t\t"<<s_look->name<&

122、lt;endl;</p><p>  s_look=s_look->next;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  

123、case 4:</b></p><p><b>  {</b></p><p>  cout<<endl<<"============歸--約--規(guī)--則============"<<endl;</p><p>  while(!feof(fp)) printf("

124、%c",fgetc(fp));//顯示打開(kāi)的文件</p><p>  cout<<endl<<"============LR--分--析--表============"<<endl;</p><p>  r_new=r_head;</p><p><b>  int l=-1;</b

125、></p><p>  while(r_new){</p><p>  if(l==r_new->line_States){</p><p>  cout<<" "<<r_new->rank_Letter<<"="<<r_new->name<&l

126、t;r_new->relationship;</p><p><b>  }</b></p><p><b>  else{</b></p><p><b>  l++;</b></p><p>  cout<<endl<<l<<

127、9;\t'<<r_new->rank_Letter<<"="<<r_new->name<<r_new->relationship;</p><p><b>  }</b></p><p>  r_new=r_new->next;</p><p>

128、<b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>

129、  //======================================================// </p><p>  主函數(shù): void main()</p><p>  void main(){</p><p>  cout<<"簡(jiǎn)易C語(yǔ)言編譯器"<<endl<<endl;&

130、lt;/p><p>  struct Word *head,*find;</p><p>  struct Relation *r_head;</p><p>  struct Guiyue *g_head;</p><p>  struct Stack *s_head;</p><p>  head=(Word *)ma

131、lloc(sizeof(Word));</p><p>  head->next=NULL;</p><p>  r_head=(Relation *)malloc(sizeof(Relation));</p><p>  r_head->next=NULL;</p><p>  s_head=(Stack *)malloc(si

132、zeof(Stack));</p><p>  s_head->name='$';</p><p>  s_head->num=0;</p><p>  s_head->next=NULL;</p><p>  int goon=2,cal,i=0;</p><p>  char do

133、cument[50],str[1000];//另存輸入流</p><p>  FILE *fp2;</p><p>  cout<<"請(qǐng)輸入源代碼文件名。程序已提供 test1.c(正確的源代碼) 和 test2.c(有錯(cuò)誤的源代碼)"<<endl;</p><p>  cout<<"注意請(qǐng)輸入文件的

134、全路徑名,而且文件后綴名必須為 *.c "<<endl;</p><p>  cout<<"Let's go-->" ;</p><p>  cin>>document;</p><p>  cout<<endl;</p><p>  if((fp1=

135、fopen(document,"rt"))==NULL){</p><p>  cout<<"\n文件不存在或者打開(kāi)失敗,謝謝使用!"<<endl;</p><p><b>  exit(0);</b></p><p><b>  }</b></p&g

136、t;<p>  fp2=fopen("LR.txt","rt");</p><p>  int flag=1;</p><p>  if(head->next==NULL){ </p><p>  scan(); //生成輸入流(1),從文件中掃描源代碼語(yǔ)句,保存在緩沖區(qū)</p><

137、;p>  head=InitWord(); //生成單詞表(2),從緩沖區(qū)中讀取字符串語(yǔ)句,進(jìn)行詞法分析</p><p>  find=head;</p><p>  while(find){</p><p>  str[i]=find->mark_name;</p><p>  find=find->next;</p

138、><p><b>  i++;</b></p><p><b>  }</b></p><p>  str[i]='$';</p><p>  str[i+1]='\0';</p><p><b>  cal=i+1;</b>

139、</p><p><b>  }</b></p><p><b>  flag++;</b></p><p>  system("pause");</p><p>  cout<<endl<<"簡(jiǎn)易C語(yǔ)言編譯器"<<endl

140、;</p><p>  Print(flag,head,fp2,r_head);</p><p><b>  flag++;</b></p><p>  system("pause");</p><p>  cout<<endl<<"簡(jiǎn)易C語(yǔ)言編譯器"<

141、;<endl;</p><p>  if(r_head->next==NULL){ </p><p>  g_head=FirstGuiyue();//從文件中讀取文法語(yǔ)句,打印文法</p><p>  r_head=FirstRelation();//生成LR分析表</p><p><b>  }</b&g

142、t;</p><p>  //if (flag==3) { Print(flag,head,fp2,r_head); continue; } </p><p>  if(goon==2){ </p><p>  goon=ResultAnely(r_head,s_head,str,g_head,cal);//語(yǔ)法分析</p><p&

143、gt;  FindWordDeclare(head);//檢查正確性,判斷符號(hào)是否對(duì)稱(chēng)</p><p><b>  }</b></p><p>  // if (flag==3) continue; </p><p>  system("pause");</p><p>  cout<&

144、lt;endl<<"簡(jiǎn)易C語(yǔ)言編譯器"<<endl;</p><p><b>  flag++;</b></p><p>  FourStyle(goon,head);//生成四元式(4)</p><p><b>  flag=0;</b></p><p>

145、;  fclose(fp1); fclose(fp2);</p><p><b>  }</b></p><p><b>  5、測(cè)試及分析</b></p><p><b>  1.打開(kāi)源文正確的</b></p><p><b>  2、詞法分析:</b>

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論