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

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  基于算符優(yōu)先分析方法 </p><p><b>  的表達(dá)式語(yǔ)法分析器</b></p><p><b>  EEEE年O月A日</b></p><p><b>  目 錄</b></p><p><b>  前 言1<

2、/b></p><p>  第1章 課程設(shè)計(jì)計(jì)劃4</p><p>  1.1員與工作分配4</p><p><b>  1.2課程計(jì)劃4</b></p><p><b>  1.3資源需求4</b></p><p>  第2章 功能需求分析5</p&g

3、t;<p>  2.1 功能需求清單5</p><p>  第3章 設(shè)計(jì)、分析與編碼6</p><p>  3.1 總體設(shè)計(jì)6</p><p>  3.1.1 模塊劃分6</p><p>  3.1.2程序分包6</p><p>  3.2 詳細(xì)設(shè)計(jì)7</p><p>

4、  3.2.1 類圖7</p><p>  3.3 程序流程圖9</p><p>  3.4 分析與編碼實(shí)現(xiàn)10</p><p>  3.4.1表達(dá)式文法G[E’]構(gòu)造算符優(yōu)先關(guān)系表10</p><p>  3.4.2 根據(jù)算符優(yōu)先表用棧結(jié)構(gòu)來(lái)實(shí)現(xiàn)算符優(yōu)先分析13</p><p>  3.4.3 輔助工具類設(shè)

5、計(jì)18</p><p>  第4章 測(cè)試用例及程序截圖21</p><p>  4.1第一版測(cè)試………………………………………………………………………………………………………………214.1第二版測(cè)試………………………………………………………………………………………………………………25</p><p>  4.2 第三版測(cè)試28</p>&

6、lt;p>  第5章 用戶使用說(shuō)明32</p><p>  5.1 使用步驟32</p><p>  附錄1. 參考文獻(xiàn)33</p><p>  附錄2. 總結(jié)33</p><p><b>  前 言</b></p><p><b>  1.摘要</b>&l

7、t;/p><p>  編譯原理是計(jì)算機(jī)專業(yè)的一門(mén)重要專業(yè)課,旨在介紹編譯程序構(gòu)造的一般原理和基本方法。內(nèi)容包括語(yǔ)言和文法、詞法分析、語(yǔ)法分析、語(yǔ)法制導(dǎo)翻譯、中間代碼生成、存儲(chǔ)管理、代碼優(yōu)化和目標(biāo)代碼生成。編譯原理是計(jì)算機(jī)專業(yè)設(shè)置的一門(mén)重要的專業(yè)課程。雖然只有少數(shù)人從事編譯方面的工作,但是這門(mén)課在理論、技術(shù)、方法上都對(duì)學(xué)生提供了系統(tǒng)而有效的訓(xùn)練,有利于提高軟件人員的素質(zhì)和能力。算符優(yōu)先分析法是一種簡(jiǎn)單直觀、特別方便于表

8、達(dá)式分析,易于手式實(shí)現(xiàn)的方法。算符優(yōu)先法只考慮算符(廣義為終結(jié)符號(hào))之間的優(yōu)先關(guān)系,它是一種自底向上的歸約過(guò)程,但這種歸約未必嚴(yán)格按照句柄歸約。它是一種不規(guī)范歸約法。算符優(yōu)先分析法的關(guān)鍵是比較兩個(gè)相繼出現(xiàn)的終結(jié)符號(hào)的優(yōu)先級(jí)而決定應(yīng)采取的動(dòng)作。要完成算符間的優(yōu)先級(jí)比較,就要先定義各種可能出相繼出現(xiàn)的運(yùn)算符的優(yōu)先級(jí),并將其表示成矩陣形式,在分析過(guò)程中通過(guò)查詢矩陣元素而得出算符間的優(yōu)先關(guān)系。</p><p><b

9、>  2.問(wèn)題描述</b></p><p><b>  給出該文法</b></p><p><b>  E’ →# E #</b></p><p>  E → E + Q | Q</p><p>  Q → Q - T | T</p><p>  T → T

10、 * F | F</p><p>  F → F/ M|M</p><p>  M → M^ P|P</p><p>  P → ( E )|i</p><p>  用算符優(yōu)先分析法實(shí)現(xiàn)對(duì)表達(dá)式的計(jì)算。</p><p><b>  3.項(xiàng)目開(kāi)發(fā)平臺(tái)</b></p><p>

11、<b>  語(yǔ)言:Java</b></p><p>  開(kāi)發(fā)平臺(tái):MyEclipse</p><p>  第1章 課程設(shè)計(jì)計(jì)劃</p><p>  1.1組員與工作分配</p><p><b>  xxx</b></p><p><b>  1.2課程計(jì)劃</

12、b></p><p>  表1.2.1 課程設(shè)計(jì)計(jì)劃清單</p><p><b>  1.3資源需求</b></p><p>  表1.3.1開(kāi)發(fā)資源</p><p>  第2章 功能需求分析</p><p>  2.1 功能需求清單</p><p>  表2.1.1

13、 需求清單</p><p>  第3章 設(shè)計(jì)、分析與編碼</p><p><b>  3.1 總體設(shè)計(jì)</b></p><p>  3.1.1 模塊劃分</p><p>  該語(yǔ)法分析器可分為以下幾個(gè)主要模塊:</p><p>  1. 詞法分析并計(jì)算模塊</p><p>

14、  其中應(yīng)有一個(gè)操作符棧和一個(gè)操作數(shù)棧,用于分析輸入的文法和句子,并提供方法檢驗(yàn)該表達(dá)式是否為給出的文法,如果是則運(yùn)算出結(jié)果,否則提示錯(cuò)誤</p><p>  2. 算符優(yōu)先表構(gòu)建模塊</p><p>  用于構(gòu)建輸入文法的算符優(yōu)先表,并對(duì)其中的算符優(yōu)先表進(jìn)行各種操作。</p><p><b>  3. 輸入功能模塊</b></p&

15、gt;<p>  提供從鍵盤(pán)輸入功能。</p><p><b>  3.1.2程序分包</b></p><p>  com.op.core 該包下為核心類,完成核心功能</p><p>  com.op.util 該報(bào)為工具包,包含一些輸入,字符串處理等</p><p>  程序之間應(yīng)該保持低耦合,高內(nèi)聚。

16、包之間的依賴關(guān)系為core->util,核心包依賴于util, util不依賴其他包。</p><p><b>  3.2 詳細(xì)設(shè)計(jì)</b></p><p><b>  3.2.1 類圖</b></p><p>  com.op.core.OperatorPrority類:該類為核心類,實(shí)現(xiàn)所有核心功能。</p

17、><p>  com.op.core.ProrityTable類:該類為存放算符優(yōu)先級(jí)表,以及對(duì)算符優(yōu)先級(jí)表查詢等操作。</p><p>  com.op.core.StringUtil類:該類實(shí)現(xiàn)必要的字符串操作。</p><p>  com.op.core.IOUtil類:該類實(shí)現(xiàn)輸入輸出等常用操作</p><p><b>  類之

18、間的依賴關(guān)系:</b></p><p>  OperatorPriority將依賴于其他三個(gè)類,而其他的類互不依賴。</p><p><b>  3.3 程序流程圖</b></p><p>  3.4 分析與編碼實(shí)現(xiàn)</p><p>  3.4.1表達(dá)式文法G[E’]構(gòu)造算符優(yōu)先關(guān)系表</p>

19、<p>  計(jì)算算符優(yōu)先只針對(duì)于終結(jié)符,終結(jié)符之間的優(yōu)先關(guān)系有三種,在計(jì)算優(yōu)先關(guān)系之前我們先定義兩個(gè)集合,對(duì)于任意兩個(gè)終結(jié)符(a,b)FIRSTVT(B)={b|B=>b…或B=>Cb…},其中…表示V*中的符號(hào)串。</p><p>  LASTVT(B)={a|B=>…a或B=>…aC}</p><p><b>  三種優(yōu)先關(guān)系:</b&

20、gt;</p><p> ?。?)等于關(guān)系:可直接查看產(chǎn)生式的右部,對(duì)如下形式的產(chǎn)生式A->…ab… A->… aBb…則有a=b成立。</p><p>  (2)小于關(guān)系:求出每個(gè)非終結(jié)符B的FIRSTVT(B),觀察如下形式的產(chǎn)生式A->…aB…對(duì)每一b∈FIRSTVT(B)有a≮b成立</p><p>  (3)大于關(guān)系:計(jì)算每個(gè)非終結(jié)符

21、B的LASTVT(B),觀察如下形式的產(chǎn)生式A->…Bb…對(duì)每一a∈LASTVT(B)有a≯b成立</p><p>  關(guān)系表:通常用矩陣的形式存放文法中各種可能的優(yōu)先關(guān)系。</p><p>  大小:矩陣是n×n的,其中n是文法中終結(jié)符的個(gè)數(shù)。</p><p>  表達(dá)式文法G[ E’]:</p><p><b>

22、;  E’ →# E #</b></p><p>  E → E + Q | Q</p><p>  Q → Q - T | T</p><p>  T → T * F | F</p><p>  F → F/ M|M</p><p>  M → M^ P|P</p><p>  P

23、 → ( E )|i</p><p>  根據(jù)上面的規(guī)則手工構(gòu)造上述文法的算符優(yōu)先表如下:</p><p><b>  代碼清單</b></p><p>  package com.op.core;</p><p>  public class PriorityTable {</p><p>  

24、private static char table[][] = {</p><p>  // + * / i ( ) # ^</p><p>  { '>', '<', '<', '<', '<', '>'

25、, '>', '<' }, // +</p><p>  { '>', '>', '>', '<', '<', '>', '>', '<' }, // *</p><p>

26、  { '>', '>', '>', '<', '<', '>', '>', '<' }, // /</p><p>  { '>', '>', '>', '$

27、9;, '$', '>', '>', '>' }, // i</p><p>  { '<', '<', '<', '<', '<', '=', '$', '<' },

28、// (</p><p>  { '>', '>', '>', '$', '$', '>', '>', '>' }, // )</p><p>  { '<', '<', '&

29、lt;', '<', '<', '$', '=', '<' }, // #</p><p>  { '>', '>', '>', '<', '<', '>', '>

30、', '<' }, // ^</p><p>  }; // 算符優(yōu)先表</p><p>  /****************************************************************</p><p>  * 判斷一個(gè)符號(hào)在算符優(yōu)先表中位置</p><p><b>

31、;  * </b></p><p>  * @param c</p><p><b>  * @return</b></p><p><b>  */</b></p><p>  private static int judgePriority(char c) {</p>

32、<p>  int priority = 0;</p><p>  switch (c) {</p><p><b>  case '+':</b></p><p>  priority = 0;</p><p><b>  break;</b></p>&l

33、t;p><b>  case '*':</b></p><p>  priority = 1;</p><p><b>  break;</b></p><p><b>  case '/':</b></p><p>  priority

34、= 2;</p><p><b>  break;</b></p><p><b>  case 'i':</b></p><p>  priority = 3;</p><p><b>  break;</b></p><p><

35、b>  case '(':</b></p><p>  priority = 4;</p><p><b>  break;</b></p><p><b>  case ')':</b></p><p>  priority = 5;</p&

36、gt;<p><b>  break;</b></p><p><b>  case '#':</b></p><p>  priority = 6;</p><p><b>  break;</b></p><p><b>  case

37、 '^':</b></p><p>  priority = 7;</p><p><b>  break;</b></p><p><b>  }</b></p><p>  return priority;</p><p><b> 

38、 }</b></p><p><b>  /**</b></p><p>  * 判斷兩個(gè)算術(shù)符的優(yōu)先級(jí)</p><p><b>  * </b></p><p>  * @param m</p><p>  * 為符號(hào)棧的棧頂元素</

39、p><p>  * @param n</p><p>  * 為當(dāng)前輸入算術(shù)符</p><p><b>  * @return</b></p><p><b>  */</b></p><p>  public static char getPriority

40、(char m, char n) {</p><p>  return PriorityTable.table[judgePriority(m)][judgePriority(n)];</p><p><b>  }</b></p><p><b>  }</b></p><p>  3.4.2 根

41、據(jù)算符優(yōu)先表用棧結(jié)構(gòu)來(lái)實(shí)現(xiàn)算符優(yōu)先分析</p><p>  設(shè)置兩個(gè)棧:存放運(yùn)算符的OPTR棧和存放操作數(shù)或運(yùn)算結(jié)果的OPND棧。具體算法描述如下:</p><p> ?。?)首先置操作數(shù)OPND棧為空棧,將#入運(yùn)算符OPTR棧。</p><p> ?。?)依次讀入表達(dá)式中每個(gè)單詞,若是操作數(shù)則進(jìn)OPND棧,若是運(yùn)算符則轉(zhuǎn)(3)。</p><p&

42、gt; ?。?)當(dāng)前設(shè)讀入的運(yùn)算符為θ2,查找算符優(yōu)先關(guān)系表,比較θ2與OPTR棧頂元素θ1 :</p><p>  若θ1<θ2,則θ2進(jìn)OPTR棧,轉(zhuǎn)(2);</p><p>  若θ1=θ2, 如θ2為#,則分析成功,否則OPTR棧頂元素θ1出棧,并轉(zhuǎn)(2);</p><p>  若θ1>θ2,則出棧OPND棧頂元素存放到b,又出棧其新棧頂元素存放到a,

43、再出棧OPTR棧頂元素至t,進(jìn)行運(yùn)算r=a t b (t為運(yùn)算符),并將結(jié)果r存入棧OPND后轉(zhuǎn)(2);</p><p>  若θ1和θ2之間無(wú)優(yōu)先關(guān)系,則報(bào)錯(cuò)。</p><p><b>  分析歸約流程圖</b></p><p>  在分析過(guò)程中,利用分析棧存放已識(shí)別的那部分句型,而句型的其余部分由剩余輸入串組成,通過(guò)比較棧頂符號(hào)和下一個(gè)輸入

44、符號(hào)之間的關(guān)系,如果是小于或等于則將輸入串一次逐個(gè)存入符號(hào)棧中,直到遇到棧頂符號(hào)的優(yōu)先關(guān)系大于下一個(gè)待輸入符號(hào)為止,此時(shí)可以判別棧頂符號(hào)是否為句柄尾符號(hào)。如果是句柄尾,則沿棧頂向下,在棧內(nèi)尋找句柄頭(利用文法的某條規(guī)則),然后把它們彈出棧,并代之以歸約后的非終結(jié)符。這樣就完成了一次歸約過(guò)程。</p><p><b>  代碼清單</b></p><p>  packa

45、ge com.op.core;</p><p>  import java.math.BigDecimal;</p><p>  import java.util.Stack;</p><p>  import com.op.util.StringUtil;</p><p>  import com.op.util.IOUtil;</p

46、><p>  public class OperatorPriority {</p><p>  private Stack<Character> optrStack; //符號(hào)棧</p><p>  private Stack<Float> opndStack; //操作數(shù)棧</p><p>  privat

47、e String input; //待分析的算術(shù)表達(dá)式</p><p><b>  /*</b></p><p><b>  * 構(gòu)造函數(shù)</b></p><p>  * @param input</p><p><b>  */</b></

48、p><p>  public OperatorPriority(String input) {</p><p><b>  super();</b></p><p>  optrStack = new Stack<Character>();</p><p>  opndStack = new Stack<F

49、loat>();</p><p>  optrStack.push('#');</p><p>  this.input = input;</p><p><b>  }</b></p><p><b>  /***</b></p><p><b&

50、gt;  * 操作兩個(gè)數(shù)</b></p><p>  * @param a 操作數(shù)1</p><p>  * @param b 操作數(shù)2</p><p>  * @param op 操作符</p><p>  * @return 運(yùn)算結(jié)果</p><p><b>  */</b>&l

51、t;/p><p>  public float operateTwoNum(float a, float b, char op) {</p><p>  BigDecimal da = new BigDecimal(Float.toString(a)); </p><p>  BigDecimal db = new BigDecimal(Float.toString

52、(b)); </p><p>  switch (op) {</p><p><b>  case '*':</b></p><p>  return da.multiply(db).floatValue();</p><p><b>  case '+':</b>

53、</p><p>  return da.add(db).floatValue();</p><p><b>  case '-':</b></p><p>  return db.subtract(da).floatValue();</p><p><b>  case '/'

54、:</b></p><p>  return db.divide(da,7,BigDecimal.ROUND_HALF_UP).floatValue(); //除不盡的情況取7位精確值。</p><p><b>  case '^':</b></p><p>  return db.pow((int)a).float

55、Value();</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  /***</b></p><p>  * 判斷是否

56、為操作符</p><p>  * @param ch 被判斷字符</p><p>  * @return 布爾值</p><p><b>  */</b></p><p>  public boolean isOperator(char ch) {</p><p>  if (ch == 

57、9;+' || ch == '-' || ch == '*' || ch == '/' || ch == '('</p><p>  || ch == ')' || ch == '#'||ch=='^')</p><p>  return true;</p>

58、<p><b>  else</b></p><p>  return false;</p><p><b>  }</b></p><p><b>  /***</b></p><p>  * 掃描字符串,判斷是否對(duì)應(yīng)文法,并計(jì)算出結(jié)果</p>&l

59、t;p>  * @return 計(jì)算結(jié)果</p><p>  * @throws Exception 如果不符合文法,或者除數(shù)等于0,都將拋出異常</p><p><b>  */</b></p><p>  public String scanner() throws Exception {</p><p>

60、  int postion = 0; // 字符串上指示的指針</p><p>  char operator = 0; // 操作符</p><p>  float a = 0, b = 0; // 操作數(shù)</p><p>  String[] exp = StringUtil.splitExp(input);</p><p>  whil

61、e (true) {</p><p>  // 判斷是否為運(yùn)算符</p><p>  if (exp[postion].length()==1&&isOperator(exp[postion].charAt(0))) {</p><p>  // 需要進(jìn)行運(yùn)算符的比較</p><p>  if (!optrStack.isEm

62、pty()) {</p><p>  if (PriorityTable.getPriority(optrStack.peek().charValue(),</p><p>  exp[postion].charAt(0)) == '<')</p><p>  optrStack.push(exp[postion].charAt(0));<

63、;/p><p>  else if (PriorityTable.getPriority(optrStack.peek()</p><p>  .charValue(), exp[postion].charAt(0)) == '>') {</p><p>  a = opndStack.pop();</p><p>  b

64、= opndStack.pop();</p><p>  operator = optrStack.pop().charValue();</p><p>  opndStack.push(operateTwoNum(a, b, operator));</p><p><b>  continue;</b></p><p>

65、;  } else if (PriorityTable.getPriority(optrStack.peek()</p><p>  .charValue(), exp[postion].charAt(0)) == '=') {</p><p>  optrStack.pop();</p><p>  if (exp[postion].charAt(

66、0) == '#') {</p><p>  return opndStack.pop().toString();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  } else</b></p>

67、;<p>  optrStack.push( exp[postion].charAt(0));</p><p><b>  }</b></p><p><b>  // 為運(yùn)算數(shù)時(shí)</b></p><p><b>  else {</b></p><p>  op

68、ndStack.push(Float.valueOf((exp[postion])).floatValue());</p><p><b>  }</b></p><p>  postion++;</p><p>  if (postion >= exp.length)</p><p><b>  bre

69、ak;</b></p><p><b>  }</b></p><p>  throw new Exception();</p><p><b>  }</b></p><p><b>  /***</b></p><p>  * 程序入口,

70、啟動(dòng)函數(shù)</p><p>  * @param args</p><p><b>  */</b></p><p>  public static void main(String[] args) {</p><p>  OperatorPriority op = new OperatorPriority(IOUtil&

71、lt;/p><p>  .getStringFromKeyBoard()); //實(shí)例化 構(gòu)造函數(shù)參數(shù)從鍵盤(pán)獲得</p><p><b>  try {</b></p><p>  System.out.println("您輸入的表達(dá)式:" + op.input + "=" + op.scanner()

72、);</p><p>  } catch (Exception e) {</p><p>  // TODO Auto-generated catch block</p><p>  //e.printStackTrace();</p><p>  System.out.println("您輸入的表達(dá)式" + op.inp

73、ut + "有誤!");</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  3.4.3 輔助工具類設(shè)計(jì)</p><p>  a. 通過(guò)鍵盤(pán)輸入表

74、達(dá)式。</p><p><b>  程序清單</b></p><p>  package com.op.util;</p><p>  import java.io.BufferedReader;</p><p>  import java.io.IOException;</p><p>  im

75、port java.io.InputStreamReader;</p><p>  public class IOUtil {</p><p><b>  /***</b></p><p>  * 得到從鍵盤(pán)輸入的字符串</p><p>  * @return 字符串</p><p><b&

76、gt;  */</b></p><p>  public static String getStringFromKeyBoard() </p><p><b>  { </b></p><p><b>  try </b></p><p><b>  { &

77、lt;/b></p><p>  BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));</p><p>  System.out.print("請(qǐng)輸入一個(gè)表達(dá)式以#號(hào)結(jié)束:");</p><p>  String str=reader.read

78、Line(); //獲取字符串 </p><p>  // System.out.println("您輸入的字符串是:"+str);</p><p>  return str;</p><p>  } catch (IOException e) </p><p><b>  { </b

79、></p><p>  e.printStackTrace(); </p><p><b>  }</b></p><p>  return null; </p><p><b>  }</b></p><p><b>  }</b><

80、;/p><p><b>  b. 字符串處理類</b></p><p>  將從鍵盤(pán)輸入的字符串表達(dá)式進(jìn)行簡(jiǎn)單的切分,存入字符串?dāng)?shù)組。這個(gè)類是為了在掃描表達(dá)式時(shí)能對(duì)其中的操作數(shù)與操作符進(jìn)行方便的操作。</p><p><b>  程序清單</b></p><p>  package com.op.uti

81、l;</p><p>  import java.util.Vector;</p><p>  public class StringUtil {</p><p><b>  /***</b></p><p>  * 切分算術(shù)表達(dá)式,結(jié)果存入字符串?dāng)?shù)組,如: 字符串:1.5+3*2# 將被切分為 {1.5,+,3,*,

82、2,#}</p><p>  * @param str</p><p><b>  * @return</b></p><p><b>  */</b></p><p>  public static String[] splitExp(String str) {</p><p&

83、gt;  Vector<String> v = new Vector<String>();</p><p>  int beginIndex = 0;</p><p>  for (int i = 0; i < str.trim().length(); i++) {</p><p>  if ((str.charAt(i) > 3

84、2 && str.charAt(i) < 48&&str.charAt(i)!=46)||str.charAt(i)==94) {</p><p>  if(beginIndex!=i)</p><p>  v.add( str.substring(beginIndex, i));</p><p>  v.add( String

85、.valueOf(str.charAt(i)));</p><p>  beginIndex = i + 1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(beginIndex!=str.length())</p><

86、p>  v.add(str.substring(beginIndex, str.length()));</p><p>  String result[]=new String[v.size()];</p><p>  for(int i=0;i<v.size();i++)</p><p><b>  {</b></p>

87、<p>  result[i]=v.get(i);</p><p><b>  }</b></p><p>  return result;</p><p><b>  }</b></p><p><b>  }</b></p><p>&

88、lt;b>  測(cè)試用例及程序截圖</b></p><p>  本次設(shè)計(jì)經(jīng)過(guò)三次測(cè)試形成最終版本</p><p><b>  4.1第一版測(cè)試</b></p><p>  1、如果正確輸入表達(dá)式應(yīng)能正確得出結(jié)果</p><p>  當(dāng)輸入10+15*4#后,預(yù)計(jì)結(jié)果為70,實(shí)際結(jié)果為:70.0</p

89、><p>  之所以會(huì)出現(xiàn)70.0是因?yàn)檩敵鼋Y(jié)果的精度不一樣。提示“請(qǐng)按任意鍵繼續(xù)…”,當(dāng)按下任意鍵時(shí),退出了程序。程序應(yīng)該跳到開(kāi)始處,提醒用戶再次輸入表達(dá)式并以#號(hào)結(jié)束。</p><p>  2、如果輸入一個(gè)錯(cuò)誤的表達(dá)式應(yīng)能給出錯(cuò)誤信息</p><p>  從圖中所輸入的表達(dá)式跟文法進(jìn)行分析可以得出10不是文法的句子,故輸出的結(jié)果為:您輸入的表達(dá)式10+*15+有誤!

90、</p><p><b>  3、對(duì)負(fù)號(hào)的處理</b></p><p>  經(jīng)過(guò)對(duì)文法的分析并沒(méi)有對(duì)負(fù)數(shù)的處理,在這里他會(huì)認(rèn)為是減號(hào),而在減號(hào)的左邊缺少一個(gè)元素,故輸出的結(jié)果為:您輸入的表達(dá)式(-10)*2有誤!</p><p><b>  4、對(duì)于單個(gè)的整數(shù)</b></p><p>  5、測(cè)試除

91、法優(yōu)先操作</p><p>  測(cè)試結(jié)果與預(yù)計(jì)的結(jié)果不符合,經(jīng)過(guò)分析得出,之所以上圖的結(jié)果會(huì)是11是因?yàn)樗乃惴ú襟E為:(1)、2*4=8 (2)、(6/2)=3 (3)、3/2=1 (4)、8+3*1=11 在這里出現(xiàn)了兩個(gè)錯(cuò)誤:第一個(gè)錯(cuò)誤在計(jì)算整數(shù)除的時(shí)候3/2=1出現(xiàn)錯(cuò)誤;第二個(gè)錯(cuò)誤為在計(jì)算(6/2)*3/2的問(wèn)題上出現(xiàn)處理錯(cuò)誤,他這里計(jì)算除法優(yōu)先于乘法運(yùn)算了,在乘法與除法之間的優(yōu)先為誰(shuí)先出現(xiàn)就先計(jì)算誰(shuí)

92、。正確的算法為:(1)、2*4=8 (2)、(6/2)=3 (3)、3*3=9 (4)、9/2=4.5 (5)、8+4.5=12.5</p><p><b>  6、乘方的測(cè)試</b></p><p>  測(cè)試結(jié)果與預(yù)計(jì)的結(jié)果不符合,經(jīng)過(guò)對(duì)文法的分析得出此語(yǔ)句為方法的句子,這時(shí)可以確定為在編寫(xiě)程序代碼時(shí)沒(méi)有完成此功能。</p><p>  

93、7、對(duì)于不是方法句子的表達(dá)式情況下</p><p>  8、在輸入時(shí)不加“#”</p><p><b>  測(cè)試報(bào)告</b></p><p>  本次測(cè)試中發(fā)現(xiàn)設(shè)計(jì)中并未涉及到乘方運(yùn)算,且除法運(yùn)算的并非是自左向右而是自右向左的,且除法運(yùn)算優(yōu)先級(jí)大于乘法運(yùn)算,需作修改維護(hù)</p><p><b>  4.2第二版

94、測(cè)試</b></p><p>  根據(jù)第一版中的問(wèn)題進(jìn)行測(cè)試</p><p><b>  測(cè)試報(bào)告</b></p><p>  1、對(duì)于版本1中沒(méi)有解決的問(wèn)題己經(jīng)解決了,主要是對(duì)浮點(diǎn)數(shù)的處理。</p><p>  2針對(duì)于符點(diǎn)操作與浮點(diǎn)優(yōu)先測(cè)試</p><p>  3、針對(duì)乘除法優(yōu)先操

95、作的測(cè)試</p><p>  4、針對(duì)乘方問(wèn)題的測(cè)試,依舊沒(méi)有解決需要進(jìn)一步改進(jìn)程序</p><p>  4.3第三版測(cè)試(根據(jù)上述版本錯(cuò)誤進(jìn)行測(cè)試且對(duì)全部進(jìn)入回溯測(cè)試)</p><p>  根據(jù)右邊流程圖進(jìn)行路徑測(cè)試</p><p><b>  測(cè)試報(bào)告</b></p><p><b>

96、;  圖1:</b></p><p><b>  圖2:</b></p><p><b>  圖3:</b></p><p><b>  圖4:</b></p><p><b>  圖5:</b></p><p><

97、;b>  圖6:</b></p><p>  對(duì)于文法里面沒(méi)有給出的規(guī)則測(cè)試時(shí)候仍會(huì)顯示輸入的表達(dá)式有誤的提示</p><p>  第5章 用戶使用說(shuō)明</p><p><b>  5.1 使用步驟</b></p><p>  1.下載安裝JDK1.5或以上版本</p><p>

98、;  2.打開(kāi)bin目錄,運(yùn)行批處理文件(雙擊運(yùn)行.bat)。</p><p>  3. 從鍵盤(pán)輸入要計(jì)算的表達(dá)式</p><p>  4.以#號(hào)結(jié)束,回車。</p><p><b>  附錄</b></p><p><b>  附錄1. 參考文獻(xiàn)</b></p><p> 

99、 1、黃賢英,劉貞 ,劉全利;“編譯原理”課程的地位及教改思路[J];重慶科技學(xué)院學(xué)報(bào)(社會(huì)科學(xué)版);2005年03期</p><p>  2、張素琴,呂映芝,蔣維杜,戴桂蘭; 《編譯原理》(第二版);清華大學(xué)出版社;2009年5月第12次印刷</p><p>  3、王雷,劉志成,周晶 ;編譯原理課程設(shè)計(jì); 2005</p><p>  4、期刊論文 淺談&quo

100、t;編譯原理"課程教學(xué) - 廣東工業(yè)大學(xué)學(xué)報(bào)(社會(huì)科學(xué)版)2005,5</p><p><b>  附錄2. 總結(jié)</b></p><p>  本小組在拿到這次課程設(shè)計(jì)后,立即從需求著手,進(jìn)行了全面而又細(xì)致的需求分析。</p><p>  算符優(yōu)先分析方法有一定的局限性由于算符優(yōu)先分析法去掉了單非終結(jié)符之間的歸約,盡管在分析過(guò)程中,當(dāng)

101、決定是否為句柄時(shí)采取一些檢查措施,但仍難完全避免把錯(cuò)誤的句子得到正確的歸約。</p><p>  此外,通常一個(gè)適用語(yǔ)言的文法也很難滿足算符優(yōu)先文法的條件,因而致使算符優(yōu)先分析法僅適用于表達(dá)式的語(yǔ)法分析。</p><p>  本次課程設(shè)計(jì),我們使用的開(kāi)發(fā)語(yǔ)言是Java,開(kāi)發(fā)工具是 MyEclipse。在開(kāi)發(fā)的過(guò)程中,本小組曾遇到不少難點(diǎn),我們并沒(méi)有氣餒,而是去請(qǐng)教老師,同學(xué),上網(wǎng)去查資料經(jīng)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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)論