編譯原理課程設計-詞法語法分析器_第1頁
已閱讀1頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  課程設計1-C語言詞法分析器</p><p><b>  1.題目</b></p><p>  C語言詞法分析2.內(nèi)容</p><p>  選一個能正常運行的c語言程序,以該程序出現(xiàn)的字符作為單詞符號集,不用處理c語言的所有單詞符號。將解析到的單詞符號對應的二元組輸出到文件中保存可以將掃描緩沖區(qū)與輸入緩沖區(qū)合成一個緩

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

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

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

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

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

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

8、lt;b>  7.程序清單</b></p><p>  // ConsoleApplication1.cpp : 定義控制臺應用程序的入口點。</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];//存放構成單詞符號的字符串</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()//讀一個字符到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>  //讀一個非空白字符到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種別號\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.運行結(jié)果</b></p><p>  E:/作

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

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

48、變量中;若存在錯誤,提示錯誤相關信息。</p><p><b>  設計目的</b></p><p>  了解掌握算符優(yōu)先分析的基本方法、內(nèi)容;</p><p><b>  設計環(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>  概要設計</b></p><p><b>  5.1設計思路</b></p><p>  語法分析的任務: 把單詞符號作為基本單位,分析程序是否為合法的程序.<

50、;/p><p>  算符優(yōu)先分析法是自下而上的語法分析方法,即根據(jù)文法,對輸入字串進行歸約,若能正確地歸約為文法的初始符號,則表示輸入字串是合法的.主要研究對輸入的賦值語句、輸出語句、清除語句進行詞法分析、語法分析、表達式求值并存儲于指定變量中;若存在錯誤,提示錯誤相關信息。</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 單詞種別碼設計</p><p><b>  詳細設計</b></p><p>  6.

52、1 變量及函數(shù)說明</p><p><b>  程序清單</b></p><p>  // ConsoleApplication1.cpp : 定義控制臺應用程序的入口點。</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//保留字個數(shù)</p><p>  char ch = '\0';//存放最新讀進的源程序字符</p><p>  char strToken[20] = "\0"

55、;;//存放構成單詞符號的字符串</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)先關系矩陣</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()//讀一個字符到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()//讀一個非空白字符到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();//詞法分析器獲得一個分析詞</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)//關鍵字</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)未識別單詞!\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>  //運算歸約</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表達式的值為 %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當前歸約棧:");</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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論