版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設(shè)計(jì)--- 語(yǔ)法分析器
- 編譯原理課程設(shè)計(jì)---語(yǔ)法分析器
- 編譯原理課程設(shè)計(jì)--語(yǔ)法分析器
- 編譯原理語(yǔ)法分析器課程設(shè)計(jì)
- 編譯原理詞法分析器語(yǔ)法分析課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)(c++)-語(yǔ)法分析器
- 語(yǔ)法分析課程設(shè)計(jì)---編譯原理語(yǔ)法分析器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)-詞法語(yǔ)法分析器
- 編譯原理課程設(shè)計(jì)--算術(shù)表達(dá)式的語(yǔ)法分析及語(yǔ)義分析程序設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--pascal語(yǔ)言詞法、語(yǔ)法分析器設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--構(gòu)造lr(0)分析法語(yǔ)法分析器
- 基于表達(dá)式計(jì)算器的編譯原理課程設(shè)計(jì)
- 課程設(shè)計(jì)----編譯原理詞法分析器
- 正則表達(dá)式分析器
- c-minus詞法分析和語(yǔ)法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)
- 編譯課程設(shè)計(jì)-遞歸下降語(yǔ)法分析
- 編譯原理課程設(shè)計(jì)詞法分析器文檔
- 編譯原理課程設(shè)計(jì)報(bào)告詞法分析器
- 編譯原理課程設(shè)計(jì)--c-編譯器詞法分析與語(yǔ)法分析的實(shí)現(xiàn)
- 編譯原理語(yǔ)法分析
評(píng)論
0/150
提交評(píng)論