編譯原理課程設(shè)計(jì)-詞法語法分析器_第1頁
已閱讀1頁,還剩20頁未讀 繼續(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>  課程設(shè)計(jì)1-C語言詞法分析器</p><p><b>  1.題目</b></p><p>  C語言詞法分析2.內(nèi)容</p><p>  選一個(gè)能正常運(yùn)行的c語言程序,以該程序出現(xiàn)的字符作為單詞符號(hào)集,不用處理c語言的所有單詞符號(hào)。將解析到的單詞符號(hào)對(duì)應(yīng)的二元組輸出到文件中保存可以將掃描緩沖區(qū)與輸入緩沖區(qū)合成一個(gè)緩

2、沖區(qū),一次性輸入源程序后就可以進(jìn)行預(yù)處理了3.設(shè)計(jì)目的</p><p>  掌握詞法分析算法,設(shè)計(jì)、編制并調(diào)試一個(gè)詞法分析程序,加深對(duì)詞法分析原理的理解4.設(shè)計(jì)環(huán)境(電腦語言環(huán)境)</p><p><b>  語言環(huán)境:C語言</b></p><p>  CPU:i7HQ6700</p><p>  內(nèi)存:8G5.

3、概要設(shè)計(jì)(單詞符號(hào)表,狀態(tài)轉(zhuǎn)換圖)</p><p>  5.1 詞法分析器的結(jié)構(gòu)</p><p>  詞法分析程序的功能:</p><p>  輸入:所給文法的源程序字符串。</p><p>  輸出:二元組(syn,token或sum)構(gòu)成的序列。</p><p>  詞法分析程序可以單獨(dú)為一個(gè)程序;也可以作為整個(gè)編

4、譯程序的一個(gè)子程序,當(dāng)需要一個(gè)單詞時(shí),就調(diào)用此法分析子程序返回一個(gè)單詞.</p><p>  為便于程序?qū)崿F(xiàn),假設(shè)每個(gè)單詞間都有界符或運(yùn)算符或空格隔開,并引入下面的全局變量及子程序:</p><p>  1) ch 存放最新讀進(jìn)的源程序字符</p><p>  2) strToken 存放構(gòu)成單詞符號(hào)的字符串</p>

5、<p>  3) Buffer字符緩沖區(qū)</p><p>  4)struct keyType 存放保留字的符號(hào)和種別</p><p>  5.2 待分析的簡(jiǎn)單詞法</p><p><b> ?。?)保留字</b></p><p>  break、case、char、const、int、do、whil

6、e…</p><p>  (2)運(yùn)算符和界符</p><p>  = 、+、 -、 * 、/、%、,、;、(、)、?、#</p><p>  5.3 各種單詞符號(hào)對(duì)應(yīng)的種別碼</p><p><b>  5.3 狀態(tài)轉(zhuǎn)換圖</b></p><p>  6.詳細(xì)設(shè)計(jì)(數(shù)據(jù)結(jié)構(gòu),子程序)</p

7、><p><b>  算法思想:</b></p><p>  首先設(shè)置3個(gè)變量:①strToken用來存放構(gòu)成單詞符號(hào)的字符串;②ch用來字符;③struct keyType用來存放單詞符號(hào)的種別碼。掃描子程序主要部分流程如下圖所示。</p><p><b>  子程序結(jié)構(gòu):</b></p><p>&

8、lt;b>  7.程序清單</b></p><p>  // ConsoleApplication1.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。</p><p><b>  //</b></p><p>  #include "stdafx.h"</p><p>  #include

9、"stdio.h"</p><p>  #include "stdlib.h"</p><p>  #include "conio.h"</p><p>  #include "string.h"</p><p>  #define N 47</p>

10、<p><b>  char ch;</b></p><p>  char strToken[20];//存放構(gòu)成單詞符號(hào)的字符串</p><p>  char buffer[1024];//字符緩沖區(qū)</p><p>  struct keyType {</p><p>  char keyname[

11、256];</p><p>  int value;</p><p>  }Key[N] = { { "$ID",0 },{ "$INT",1 },{ "auto",2 },{ "break",3 },{ "case",4 },</p><p>  { "c

12、har",5 },{ "const",6 },{ "continue",7 },{ "default",8 },{ "do",9 },</p><p>  { "double",10 },{ "else",11 },{ "enum",12 },{ "ext

13、ern",13 },{ "float",14 },</p><p>  { "for",15 },{ "goto",16 },{ "if",17 },{ "int",18 },{ "long",19 },{ "register",20 },</p>&

14、lt;p>  { "return",21 },{ "short",22 },{ "signed",23 },{ "sizeof",24 },{ "static",25 },</p><p>  { "struct",26 },{ "switch",27 },{ &quo

15、t;typedef",28 },{ "union",29 },{ "unsigned",30 },</p><p>  { "void",31 },{ "volatile",32 },{ "while",33 },{ "=",34 },{ "+",35 },{ &q

16、uot;-",36 },{ "*",37 },</p><p>  { "/",38 },{ "%",39 },{ ",",40 },{ ";",41 },{ "(",42 },{ ")",43 },{ "?",44 },{ "clea

17、r",45 },{ "#",46 } };</p><p>  void GetChar()//讀一個(gè)字符到ch中</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  if (strlen(buffer)>

18、;0) {</p><p>  ch = buffer[0];</p><p>  for (i = 0; i<256; i++)</p><p>  buffer[i] = buffer[i + 1];</p><p><b>  }</b></p><p><b>  else

19、</b></p><p>  ch = '\0';</p><p><b>  }</b></p><p>  void GetBC()</p><p>  //讀一個(gè)非空白字符到ch中</p><p><b>  {</b></p>

20、<p><b>  int i;</b></p><p>  while (strlen(buffer)) {</p><p><b>  i = 0;</b></p><p>  ch = buffer[i];</p><p>  for (; i<256; i++) bu

21、ffer[i] = buffer[i + 1];</p><p>  if (ch != ' '&&ch != '\n'&&ch != '\0')break;</p><p><b>  }</b></p><p><b>  }</b>&l

22、t;/p><p>  void ConCat()</p><p>  //把ch連接到strToken之后</p><p><b>  {</b></p><p>  char temp[2];</p><p>  temp[0] = ch;</p><p>  temp[1

23、] = '\0';</p><p>  strcat(strToken, temp);</p><p><b>  }</b></p><p>  bool Letter()</p><p>  //判斷ch是否為字母</p><p><b>  {</b>

24、</p><p>  if (ch >= 'A'&&ch <= 'Z' || ch >= 'a'&&ch <= 'z')</p><p>  return true;</p><p><b>  else</b></p&

25、gt;<p>  return false;</p><p><b>  }</b></p><p>  bool Digit()</p><p>  //判斷ch是否為數(shù)字</p><p><b>  {</b></p><p>  if (ch >=

26、 '0'&&ch <= '9')</p><p>  return true;</p><p><b>  else</b></p><p>  return false;</p><p><b>  }</b></p><p

27、>  int Reserve()</p><p>  //用strToken中的字符查找保留字表,并返回保留字種別碼,若返回0,則非保留字</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for (i = 0; i<N; i

28、++)</p><p>  if (strcmp(strToken, Key[i].keyname) == 0)</p><p>  return Key[i].value;</p><p><b>  return 0;</b></p><p><b>  }</b></p><

29、;p>  void Retract()</p><p>  //把ch中的字符回送到緩沖區(qū)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  if (ch != '\0') {</p><p>

30、;  buffer[256] = '\0';</p><p>  for (i = 255; i>0; i--)</p><p>  buffer[i] = buffer[i - 1];</p><p>  buffer[0] = ch;</p><p><b>  }</b></p>

31、<p>  ch = '\0';</p><p><b>  }</b></p><p>  keyType ReturnWord()</p><p><b>  {</b></p><p>  strcpy(strToken, "\0");</

32、p><p><b>  int c;</b></p><p>  keyType tempkey;</p><p><b>  GetBC();</b></p><p>  if (ch >= 'A'&&ch <= 'Z' || ch >

33、= 'a'&&ch <= 'z') {</p><p><b>  ConCat();</b></p><p>  GetChar();</p><p>  while (Letter() || Digit()) {</p><p><b>  ConCat

34、();</b></p><p>  GetChar();</p><p><b>  }</b></p><p>  Retract();</p><p>  c = Reserve();</p><p>  strcpy(tempkey.keyname, strToken);<

35、/p><p>  if (c == 0)</p><p>  tempkey.value = 0;</p><p><b>  else</b></p><p>  tempkey.value = Key[c].value;</p><p><b>  }</b></p&g

36、t;<p>  else if (ch >= '0'&&ch <= '9') {</p><p><b>  ConCat();</b></p><p>  GetChar();</p><p>  while (Digit()) {</p><p&g

37、t;<b>  ConCat();</b></p><p>  GetChar();</p><p><b>  }</b></p><p>  Retract();</p><p>  strcpy(tempkey.keyname, strToken);</p><p> 

38、 tempkey.value = 1;</p><p><b>  }</b></p><p><b>  else {</b></p><p><b>  ConCat();</b></p><p>  strcpy(tempkey.keyname, strToken);&l

39、t;/p><p>  tempkey.value = Reserve();</p><p><b>  }</b></p><p>  return tempkey;</p><p><b>  }</b></p><p><b>  /*</b></

40、p><p><b>  主函數(shù)</b></p><p><b>  */</b></p><p>  int main() {</p><p><b>  //文件操作</b></p><p><b>  FILE *fp;</b>&l

41、t;/p><p>  if ((fp = fopen("E:\\作業(yè)\\編譯原理\\Ccode.txt", "r")) == NULL) {</p><p>  printf("cannot open file/n"); exit(1);</p><p><b>  }</b

42、></p><p>  while (!feof(fp)) {</p><p>  if (fgets(buffer, 250, fp) != NULL)</p><p><b>  {</b></p><p>  printf("E:\\作業(yè)\\編譯原理\\Ccode.txt\n"); <

43、;/p><p><b>  }</b></p><p><b>  }</b></p><p>  keyType temp;</p><p>  printf("單詞\t種別號(hào)\n");</p><p>  while (strlen(buffer)) {&

44、lt;/p><p>  temp = ReturnWord();</p><p>  printf("%s\t %d\n\n", temp.keyname, temp.value);</p><p><b>  }</b></p><p>  printf("the end!\n");

45、 </p><p><b>  getch();</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  8.運(yùn)行結(jié)果</b></p><p>  E:/作

46、業(yè)/編譯原理/Code.txt</p><p><b>  運(yùn)行結(jié)果</b></p><p><b>  實(shí)驗(yàn)體會(huì)</b></p><p>  通過本次次法分析設(shè)計(jì)實(shí)驗(yàn),我加深了對(duì)詞法分析過程的理解。并在實(shí)際的設(shè)計(jì)過程深入的了解了編譯原理思想。對(duì)編譯原理課程有了更深的理解</p><p>  課程設(shè)

47、計(jì)二:設(shè)計(jì)簡(jiǎn)單的語法分析器</p><p><b>  題目</b></p><p>  設(shè)計(jì)簡(jiǎn)單的語法分析器</p><p><b>  設(shè)計(jì)內(nèi)容</b></p><p>  用算符優(yōu)先分析方法設(shè)計(jì)一個(gè)分析解釋程序,對(duì)輸入的賦值語句、輸出語句、清除語句進(jìn)行詞法分析、語法分析、表達(dá)式求值并存儲(chǔ)于指定

48、變量中;若存在錯(cuò)誤,提示錯(cuò)誤相關(guān)信息。</p><p><b>  設(shè)計(jì)目的</b></p><p>  了解掌握算符優(yōu)先分析的基本方法、內(nèi)容;</p><p><b>  設(shè)計(jì)環(huán)境</b></p><p><b>  語言環(huán)境:C語言</b></p><p

49、>  CPU:i7HQ6700</p><p><b>  內(nèi)存:8G</b></p><p><b>  概要設(shè)計(jì)</b></p><p><b>  5.1設(shè)計(jì)思路</b></p><p>  語法分析的任務(wù): 把單詞符號(hào)作為基本單位,分析程序是否為合法的程序.<

50、;/p><p>  算符優(yōu)先分析法是自下而上的語法分析方法,即根據(jù)文法,對(duì)輸入字串進(jìn)行歸約,若能正確地歸約為文法的初始符號(hào),則表示輸入字串是合法的.主要研究對(duì)輸入的賦值語句、輸出語句、清除語句進(jìn)行詞法分析、語法分析、表達(dá)式求值并存儲(chǔ)于指定變量中;若存在錯(cuò)誤,提示錯(cuò)誤相關(guān)信息。</p><p><b>  文法表示:</b></p><p>  S→

51、v=E|E?|clear</p><p>  E→E+T|E-T|T</p><p>  T→T*F|T/F|F</p><p>  F→ (E)|v|c </p><p>  5.2 單詞種別碼設(shè)計(jì)</p><p><b>  詳細(xì)設(shè)計(jì)</b></p><p>  6.

52、1 變量及函數(shù)說明</p><p><b>  程序清單</b></p><p>  // ConsoleApplication1.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。</p><p><b>  //</b></p><p>  #include "stdafx.h"<

53、;/p><p>  #include "stdio.h"</p><p>  #include "stdlib.h"</p><p>  #include "conio.h"</p><p>  #include "string.h"</p><p

54、>  #define NUM 14</p><p>  #define M 256</p><p>  #define N 47//保留字個(gè)數(shù)</p><p>  char ch = '\0';//存放最新讀進(jìn)的源程序字符</p><p>  char strToken[20] = "\0"

55、;;//存放構(gòu)成單詞符號(hào)的字符串</p><p>  char buffer[257] = "\0";//字符緩沖區(qū)</p><p>  struct keyType {</p><p>  char keyname[256];</p><p>  int value;</p><p>  }K

56、ey[N] = { { "$ID",0 },{ "$INT",1 },{ "auto",2 },{ "break",3 },{ "case",4 },</p><p>  { "char",5 },{ "const",6 },{ "continue",7

57、},{ "default",8 },{ "do",9 },</p><p>  { "double",10 },{ "else",11 },{ "enum",12 },{ "extern",13 },{ "float",14 },</p><p>  

58、{ "for",15 },{ "goto",16 },{ "if",17 },{ "int",18 },{ "long",19 },{ "register",20 },</p><p>  { "return",21 },{ "short",22 },{

59、"signed",23 },{ "sizeof",24 },{ "static",25 },</p><p>  { "struct",26 },{ "switch",27 },{ "typedef",28 },{ "union",29 },{ "unsigned&

60、quot;,30 },</p><p>  { "void",31 },{ "volatile",32 },{ "while",33 },{ "=",34 },{ "+",35 },{ "-",36 },{ "*",37 },</p><p>  {

61、"/",38 },{ "%",39 },{ ",",40 },{ ";",41 },{ "(",42 },{ ")",43 },{ "?",44 },{ "clear",45 },{ "#",46 } };</p><p><b&

62、gt;  //優(yōu)先關(guān)系矩陣</b></p><p>  int priority[NUM][NUM] = { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },</p><p>  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },</p><p>  { 0,0,0,0,0,0,0,0,0,0,0,0,1,0 },</

63、p><p>  { 0,0,0,1,1,-1,-1,-1,1,-1,0,0,1,0 },</p><p>  { 0,0,0,1,1,-1,-1,-1,1,-1,0,0,1,0 },</p><p>  { 0,0,0,1,1,1,1,-1,1,-1,0,0,1,0 },</p><p>  { 0,0,0,1,1,1,1,-1,1,-1,0,0

64、,1,0 },</p><p>  { 0,0,0,-1,-1,-1,-1,-1,2,-1,0,0,0,0 },</p><p>  { 0,0,0,1,1,1,1,0,1,0,0,0,1,0 },</p><p>  { 0,0,1,1,1,1,1,0,1,0,0,0,1,0 },</p><p>  { 0,0,0,0,0,0,0,0,0

65、,0,0,0,1,0 },</p><p>  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },</p><p>  { 0,0,0,-1,-1,-1,-1,-1,0,0,0,0,3,0 },</p><p>  { 0,0,1,0,0,0,0,0,0,0,0,0,1,0 } };</p><p>  struct VarTa

66、ble {</p><p>  VarWord elem[M];</p><p>  int len;</p><p>  }varTable;</p><p>  struct OperateStack {</p><p>  WordType elem[M];//單詞元素</p><p

67、>  int len;</p><p><b>  };</b></p><p>  OperateStack mainStack;//歸約棧</p><p>  OperateStack wordStack;</p><p>  struct WordType {</p><p>

68、;  char word[M];</p><p>  int value;</p><p>  }wordType[NUM] = { { "error",0 },{ "=",1 },{ "?",2 },{ "+",3 },{ "-",4 },{ "*",5 },{ &qu

69、ot;/",6 },{ "(",7 },{ ")",8 },{ "$i",9 },{ "$c",10 },{ "clear",11 },{ "#",12 },{ "$N",13 } };</p><p><b>  /* </b></p&

70、gt;<p><b>  變量表</b></p><p><b>  */</b></p><p>  struct VarWord {</p><p>  char varname[M];//變量名</p><p>  char value[M]; </p><

71、p>  bool flag;</p><p><b>  };</b></p><p>  void GetChar()//讀一個(gè)字符到ch中</p><p><b>  {</b></p><p><b>  int i;</b></p><p

72、>  if (strlen(buffer)>0) {</p><p>  ch = buffer[0];</p><p>  for (i = 0; i<256; i++)</p><p>  buffer[i] = buffer[i + 1];</p><p><b>  }</b></p>

73、;<p><b>  else</b></p><p>  ch = '\0';</p><p><b>  }</b></p><p>  void GetBC()//讀一個(gè)非空白字符到ch中</p><p><b>  {</b></p

74、><p><b>  int i;</b></p><p>  while (strlen(buffer)) {</p><p><b>  i = 0;</b></p><p>  ch = buffer[i];</p><p>  for (; i<256; i++)

75、 buffer[i] = buffer[i + 1];</p><p>  if (ch != ' '&&ch != '\n'&&ch != '\0')break;</p><p><b>  }</b></p><p><b>  }</b&g

76、t;</p><p>  void ConCat()//把ch連接到strToken之后</p><p><b>  {</b></p><p>  char temp[2];</p><p>  temp[0] = ch;</p><p>  temp[1] = '\0';&l

77、t;/p><p>  strcat(strToken, temp);</p><p><b>  }</b></p><p>  bool Letter()//判斷ch是否為字母</p><p><b>  {</b></p><p>  if (ch >= 'A

78、'&&ch <= 'Z' || ch >= 'a'&&ch <= 'z')</p><p>  return true;</p><p><b>  else</b></p><p>  return false;</p>&

79、lt;p><b>  }</b></p><p>  bool Digit()//判斷ch是否為數(shù)字</p><p><b>  {</b></p><p>  if (ch >= '0'&&ch <= '9')</p><p> 

80、 return true;</p><p><b>  else</b></p><p>  return false;</p><p><b>  }</b></p><p>  int Reserve()//用strToken中的字符查找保留字表,并返回保留字種別碼,若返回0,則非保留字<

81、;/p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for (i = 0; i<N; i++)</p><p>  if (strcmp(strToken, Key[i].keyname) == 0)</p><p>

82、;  return Key[i].value;</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  void Retract()//把ch中的字符回送到緩沖區(qū)</p><p><b>  {</b></p&

83、gt;<p><b>  int i;</b></p><p>  if (ch != '\0') {</p><p>  buffer[256] = '\0';</p><p>  for (i = 255; i>0; i--)</p><p>  buffer[i]

84、 = buffer[i - 1];</p><p>  buffer[0] = ch;</p><p><b>  }</b></p><p>  ch = '\0';</p><p><b>  }</b></p><p>  keyType ReturnW

85、ord()</p><p><b>  {</b></p><p>  strcpy(strToken, "\0");</p><p><b>  int c;</b></p><p>  keyType tempkey;</p><p><b>

86、;  GetBC();</b></p><p>  if (ch >= 'A'&&ch <= 'Z' || ch >= 'a'&&ch <= 'z') {</p><p><b>  ConCat();</b></p>&l

87、t;p>  GetChar();</p><p>  while (Letter() || Digit()) {</p><p><b>  ConCat();</b></p><p>  GetChar();</p><p><b>  }</b></p><p> 

88、 Retract();</p><p>  c = Reserve();</p><p>  strcpy(tempkey.keyname, strToken);</p><p>  if (c == 0)</p><p>  tempkey.value = 0;</p><p><b>  else<

89、/b></p><p>  tempkey.value = Key[c].value;</p><p><b>  }</b></p><p>  else if (ch >= '0'&&ch <= '9') {</p><p><b>  Co

90、nCat();</b></p><p>  GetChar();</p><p>  while (Digit()) {</p><p><b>  ConCat();</b></p><p>  GetChar();</p><p><b>  }</b><

91、;/p><p>  Retract();</p><p>  strcpy(tempkey.keyname, strToken);</p><p>  tempkey.value = 1;</p><p><b>  }</b></p><p><b>  else {</b>&

92、lt;/p><p><b>  ConCat();</b></p><p>  strcpy(tempkey.keyname, strToken);</p><p>  tempkey.value = Reserve();</p><p><b>  }</b></p><p>

93、  return tempkey;</p><p><b>  }</b></p><p>  bool GetwordStack() {</p><p><b>  int i;</b></p><p>  wordStack.len = 0;</p><p>  keyT

94、ype temp;</p><p>  while (strlen(buffer)) {</p><p>  temp = ReturnWord();//詞法分析器獲得一個(gè)分析詞</p><p>  if (temp.value == 1)//常數(shù)("$c",10)</p><p><b>  {

95、</b></p><p>  strcpy(wordStack.elem[wordStack.len].word, temp.keyname);</p><p>  wordStack.elem[wordStack.len].value = 10;</p><p><b>  }</b></p><p>  

96、else if (temp.value == 0)//變量("$i",9)</p><p><b>  {</b></p><p>  strcpy(wordStack.elem[wordStack.len].word, temp.keyname);</p><p>  wordStack.elem[wordSt

97、ack.len].value = 9;</p><p><b>  }</b></p><p><b>  else {</b></p><p>  for (i = 0; i<NUM; i++) {</p><p>  if (strcmp(temp.keyname, wordType[i]

98、.word) == 0)//關(guān)鍵字</p><p><b>  {</b></p><p>  wordStack.elem[wordStack.len] = wordType[i];</p><p><b>  break;</b></p><p><b>  }</b>&

99、lt;/p><p>  else if (i == NUM - 1) {</p><p>  printf("輸入串中出現(xiàn)未識(shí)別單詞!\n");</p><p>  return false;</p><p><b>  }</b></p><p><b>  }<

100、/b></p><p><b>  }</b></p><p>  wordStack.len++;</p><p><b>  }</b></p><p>  wordStack.elem[wordStack.len++] = wordType[12];</p><p&g

101、t;  return true;</p><p><b>  }</b></p><p><b>  /*</b></p><p><b>  從單詞串中取單詞</b></p><p><b>  */</b></p><p>  

102、WordType GetWord() {</p><p>  WordType temp = wordStack.elem[0];</p><p>  for (int i = 0; i<wordStack.len - 1; i++)</p><p>  wordStack.elem[i] = wordStack.elem[i + 1];</p>

103、<p>  wordStack.len--;</p><p>  return temp;</p><p><b>  }</b></p><p>  void ClearwordStack()//清空單詞串</p><p><b>  {</b></p><p

104、>  wordStack.len = 0;</p><p><b>  }</b></p><p>  void ClearmainStack()//清空歸約棧</p><p><b>  {</b></p><p>  mainStack.len = 0;</p><

105、;p><b>  }</b></p><p><b>  /*</b></p><p>  查看變量在變量表中的位置</p><p><b>  */</b></p><p>  int CheckvarTable(char a[]) {</p><p

106、>  for (int i = 0; i<M; i++)</p><p>  if (strcmp(a, varTable.elem[i].varname) == 0)</p><p><b>  return i;</b></p><p>  else if (i == M - 1)</p><p>  r

107、eturn -1;</p><p><b>  }</b></p><p><b>  /*</b></p><p><b>  添加變量</b></p><p><b>  */</b></p><p>  void Addvar

108、Table(VarWord a) {</p><p>  varTable.elem[varTable.len] = a;</p><p>  varTable.len++;</p><p><b>  }</b></p><p><b>  /*</b></p><p>&

109、lt;b>  初始化歸約棧</b></p><p><b>  */</b></p><p>  void InitmainStack()</p><p><b>  {</b></p><p>  mainStack.elem[0] = wordType[12];</p&g

110、t;<p>  mainStack.len = 1;</p><p><b>  }</b></p><p><b>  /*</b></p><p><b>  添加歸約棧</b></p><p><b>  */</b></p>

111、;<p>  void AddmainStack(WordType a)</p><p><b>  {</b></p><p>  mainStack.elem[mainStack.len] = a;</p><p>  mainStack.len++;</p><p><b>  }</

112、b></p><p><b>  /*</b></p><p><b>  歸約</b></p><p><b>  */</b></p><p>  bool Handle()</p><p><b>  {</b><

113、/p><p><b>  int i;</b></p><p><b>  //常量歸約</b></p><p>  if (mainStack.elem[mainStack.len - 1].value == 10) {</p><p>  mainStack.elem[mainStack.len -

114、 1].value = 13;</p><p><b>  }</b></p><p><b>  //變量歸約</b></p><p>  else if (mainStack.elem[mainStack.len - 1].value == 9) {</p><p>  mainStack.el

115、em[mainStack.len - 1].value = 13;</p><p>  i = CheckvarTable(mainStack.elem[mainStack.len - 1].word);</p><p>  if (i<0) {</p><p>  printf("\n變量 %s 未定義!", mainStack.elem

116、[mainStack.len - 1].word);</p><p>  return false;</p><p><b>  }</b></p><p><b>  else</b></p><p>  strcpy(mainStack.elem[mainStack.len - 1].word,

117、 varTable.elem[i].value);</p><p><b>  }</b></p><p><b>  //賦值歸約</b></p><p>  else if (mainStack.elem[mainStack.len - 2].value == 1) {</p><p>  if

118、 (mainStack.elem[mainStack.len - 3].value == 9) {</p><p>  i = CheckvarTable(mainStack.elem[mainStack.len - 3].word);</p><p>  if (i<0) {</p><p>  VarWord temp;</p><p&

119、gt;  strcpy(temp.varname, mainStack.elem[mainStack.len - 3].word);</p><p>  strcpy(temp.value, mainStack.elem[mainStack.len - 1].word);</p><p>  temp.flag = true;</p><p>  AddvarTab

120、le(temp);</p><p><b>  }</b></p><p><b>  else</b></p><p>  strcpy(varTable.elem[i].value, mainStack.elem[mainStack.len - 1].word);</p><p>  strcp

121、y(mainStack.elem[mainStack.len - 3].word, mainStack.elem[mainStack.len - 1].word);</p><p>  mainStack.elem[mainStack.len - 3].value = 13;</p><p><b>  }</b></p><p>  else

122、 if (mainStack.elem[mainStack.len - 3].value == 13)</p><p>  strcpy(mainStack.elem[mainStack.len - 3].word, mainStack.elem[mainStack.len - 1].word);</p><p>  mainStack.len = mainStack.len - 2;&l

123、t;/p><p><b>  }</b></p><p><b>  //運(yùn)算歸約</b></p><p>  else if (mainStack.elem[mainStack.len - 2].value == 3) {</p><p><b>  int a, b;</b>&

124、lt;/p><p>  a = atoi(mainStack.elem[mainStack.len - 1].word);</p><p>  b = atoi(mainStack.elem[mainStack.len - 3].word);</p><p>  a = a + b;</p><p>  itoa(a, mainStack.ele

125、m[mainStack.len - 3].word, 10);</p><p>  mainStack.len = mainStack.len - 2;</p><p><b>  }</b></p><p>  else if (mainStack.elem[mainStack.len - 2].value == 5) {</p>

126、<p><b>  int a, b;</b></p><p>  a = atoi(mainStack.elem[mainStack.len - 1].word);</p><p>  b = atoi(mainStack.elem[mainStack.len - 3].word);</p><p><b>  a =

127、 a*b;</b></p><p>  itoa(a, mainStack.elem[mainStack.len - 3].word, 10);</p><p>  mainStack.len = mainStack.len - 2;</p><p><b>  }</b></p><p><b>

128、  //輸出語句</b></p><p>  else if (wordStack.elem[0].value == 2 && mainStack.elem[mainStack.len - 1].value == 13 && mainStack.elem[mainStack.len - 2].value == 12) {</p><p>  pr

129、intf("\n表達(dá)式的值為 %s", mainStack.elem[mainStack.len - 1].word);</p><p>  mainStack.len = 0;</p><p><b>  }</b></p><p><b>  //結(jié)束歸約</b></p><p&

130、gt;  else if (mainStack.elem[mainStack.len - 2].value == 12 && wordStack.elem[0].value == 12)</p><p>  mainStack.len = mainStack.len - 2;</p><p>  return true;</p><p><b&

131、gt;  }</b></p><p>  bool MainHandle() {</p><p>  while (wordStack.len)</p><p>  if (priority[mainStack.elem[mainStack.len - 1].value][wordStack.elem[0].value] != 1)</p>

132、<p>  AddmainStack(GetWord());</p><p><b>  else {</b></p><p>  if (mainStack.len) {</p><p>  //printf("\n");</p><p>  for (int i = 0; i<m

133、ainStack.len; i++)</p><p>  printf("(%s,%d)", mainStack.elem[i].word, mainStack.elem[i].value);</p><p><b>  Handle();</b></p><p><b>  }</b></p&g

134、t;<p><b>  break;</b></p><p><b>  }</b></p><p>  if (mainStack.len)</p><p>  MainHandle();</p><p>  return true;</p><p><

135、b>  }</b></p><p><b>  /*</b></p><p><b>  主函數(shù)</b></p><p><b>  */</b></p><p>  int main() {</p><p>  int ok = 1;

136、</p><p>  WordType temp;</p><p>  int ii = 0;</p><p>  while (ok) {</p><p>  printf("\n");</p><p>  printf("輸入第 %d 語句串:",++ii);</p&g

137、t;<p>  scanf("%s", buffer);</p><p>  printf("單詞串:");</p><p>  if (!GetwordStack())</p><p><b>  return 0;</b></p><p>  for (int i

138、 = 0; i<wordStack.len; i++)</p><p>  printf("(%s,%d)", wordStack.elem[i].word, wordStack.elem[i].value);</p><p>  printf("\n當(dāng)前歸約棧:");</p><p>  InitmainStack()

139、;</p><p>  MainHandle();</p><p><b>  }</b></p><p>  printf("結(jié)束\n");</p><p><b>  return 0;</b></p><p><b>  }</b&g

溫馨提示

  • 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)論