版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 《編譯原理》</b></p><p><b> 課程設(shè)計(jì)</b></p><p> 賦值語(yǔ)句的解釋程序設(shè)計(jì)</p><p> 設(shè)計(jì)題目:賦值語(yǔ)句的解釋程序設(shè)計(jì)</p><p><b> 設(shè)計(jì)內(nèi)容:</b></p><p
2、> 用算符優(yōu)先分析方法設(shè)計(jì)一個(gè)分析解釋程序,對(duì)輸入的賦值語(yǔ)句、輸出語(yǔ)句、清除語(yǔ)句進(jìn)行詞法分析、語(yǔ)法分析、表達(dá)式求值并存儲(chǔ)于指定變量中:若存在錯(cuò)誤,提示錯(cuò)誤相關(guān)信息。</p><p><b> 設(shè)計(jì)目的:</b></p><p> 了解掌握算符優(yōu)先分析的基本方法、內(nèi)容</p><p> 學(xué)會(huì)科學(xué)思考并解決問(wèn)題,提高程序設(shè)計(jì)能力<
3、;/p><p><b> 實(shí)現(xiàn)環(huán)境</b></p><p><b> 電腦:</b></p><p> Windows10家庭中文版</p><p><b> 型號(hào):雷神</b></p><p> 處理器:Intel(R) Core(TM) i7-
4、6700HQ CPU @2.60GHz </p><p> RAM:16.0GB(15.9GB可用)</p><p> 系統(tǒng)類型:64位操作系統(tǒng),基于x64的處理器</p><p> 實(shí)現(xiàn)語(yǔ)言及環(huán)境:Java,JDK 1.8IDE:Ecplise neon.1</p><p> 概要設(shè)計(jì)文法表示:S v=E|E?|clear&
5、lt;/p><p> EE+T|E-T|T</p><p> TT*F|T/F|F</p><p> F(E)|v|c歸約規(guī)則:</p><p> N v=N| N?|clear</p><p> N N + N | N - N | N</p><p> N N * N | N
6、/ N | N</p><p> N ( N)|v|c</p><p><b> 種別碼設(shè)計(jì):</b></p><p><b> 優(yōu)先關(guān)系表</b></p><p><b> 程序流程圖</b></p><p> 詳細(xì)設(shè)計(jì)單詞符號(hào)二元組使用下
7、面的類來(lái)表示:public class WordSymbol {</p><p> public static final int TYPE_NULL = 0; //無(wú)值</p><p> public static final int TYPE_INT = 1; //整數(shù)</p><p> public static final int TYPE_STR
8、ING = 2; //字符串</p><p> int code;//種別碼</p><p> int type;//單詞符號(hào)值類型</p><p> Object value;//單詞符號(hào)的屬性值</p><p> public WordSymbol() {</p><p><b> su
9、per();</b></p><p><b> }</b></p><p> public WordSymbol(int code, int type, Object value) {</p><p><b> super();</b></p><p> this.code =
10、code;</p><p> this.type = type;</p><p> this.value = value;</p><p><b> }</b></p><p> public int getCode() {</p><p> return code;</p>
11、<p><b> }</b></p><p> public void setCode(int code) {</p><p> this.code = code;</p><p><b> }</b></p><p> public int getType() {</
12、p><p> return type;</p><p><b> }</b></p><p> public void setType(int type) {</p><p> this.type = type;</p><p><b> }</b></p>
13、<p> public Object getValue() {</p><p> return value;</p><p><b> }</b></p><p> public void setValue(Object value) {</p><p> this.value = value;&
14、lt;/p><p><b> }</b></p><p><b> @Override</b></p><p> public String toString() {</p><p> return "WordSymbol [code=" + code + ", t
15、ype=" + type + ", value=" + value + "]";</p><p><b> }</b></p><p><b> }</b></p><p> 歸約棧:用Java中的棧對(duì)象 Stack<WordSymbol> 來(lái)表示單詞
16、串:用鏈表對(duì)象List<WordSymbol>來(lái)存放單詞串變量表:使用Map<String,Integer>對(duì)象來(lái)充當(dāng)變量表,其以鍵值對(duì)的方式存放變量,鍵可以設(shè)為變量名,值存放變量值</p><p> 可歸約串語(yǔ)義解釋:變量歸約:N v,在變量表中查找該變量,若不存在則報(bào)錯(cuò):變量未定義,否則修改非終結(jié)符N的屬性值為變量v的值,并設(shè)N的種別碼為13</p><p&
17、gt; 常量歸約:N c,修改非終結(jié)符N的屬性值為常量c的值,并設(shè)N的種別碼為13</p><p> 運(yùn)算歸約:設(shè)運(yùn)算的操作數(shù)為N1,N2;將N1,N2進(jìn)行相應(yīng)運(yùn)算并將運(yùn)算結(jié)果設(shè)為N3的屬性值,將N3的種別碼設(shè)為13括號(hào)歸約:將(N)歸約為N賦值歸約:在變量表中查找被賦值的變量v,若不存在,則先在變量表中創(chuàng)建該變量,然后再將N的屬性值賦值給v,最后將 v = N歸約為N</p><p&
18、gt; 輸出語(yǔ)句:先輸出表達(dá)式N的屬性值,然后將N?歸約為N清除語(yǔ)句:將變量表中的所以變量清空,然后clear歸約為N</p><p> 運(yùn)算符之間的關(guān)系使用對(duì)象Relation來(lái)描述,其結(jié)構(gòu)如下</p><p> public class Relation {</p><p> public static final int REL_LESS = -1;
19、 // 小于</p><p> public static final int REL_EQUAL = 0; // 等于</p><p> public static final int REL_GREATER = 1; // 大于</p><p> public static final int REL_NULL = 2; // 無(wú)關(guān)系</p>
20、<p> int codeLeft, codeRight;</p><p> int relation;</p><p> public Relation() {</p><p><b> super();</b></p><p><b> }</b></p>&
21、lt;p> public Relation(int codeLeft, int codeRight, int relation) {</p><p><b> super();</b></p><p> this.codeLeft = codeLeft;</p><p> this.codeRight = codeRight;&l
22、t;/p><p> this.relation = relation;</p><p><b> }</b></p><p> public int getCodeLeft() {</p><p> return codeLeft;</p><p><b> }</b>
23、</p><p> public void setCodeLeft(int codeLeft) {</p><p> this.codeLeft = codeLeft;</p><p><b> }</b></p><p> public int getCodeRight() {</p><p
24、> return codeRight;</p><p><b> }</b></p><p> public void setCodeRight(int codeRight) {</p><p> this.codeRight = codeRight;</p><p><b> }</b&
25、gt;</p><p> public int getRelation() {</p><p> return relation;</p><p><b> }</b></p><p> public void setRelation(int relation) {</p><p> t
26、his.relation = relation;</p><p><b> }</b></p><p><b> @Override</b></p><p> public String toString() {</p><p> String str = "";<
27、/p><p> switch (relation) {</p><p><b> case -1:</b></p><p> str = " < ";</p><p><b> break;</b></p><p><b> case
28、 1:</b></p><p> str = " > ";</p><p><b> break;</b></p><p><b> case 0:</b></p><p> str = " = ";</p><p
29、><b> break;</b></p><p><b> case 2:</b></p><p> str = " 無(wú)關(guān)系 ";</p><p><b> break;</b></p><p><b> }</b>&l
30、t;/p><p> return "Relation:" + codeLeft + str + codeRight;</p><p><b> }</b></p><p><b> }</b></p><p> 同時(shí),使用Relation[][]二維數(shù)組來(lái)存放優(yōu)先符關(guān)系表&l
31、t;/p><p> 程序清單package tp;</p><p> import java.util.ArrayList;</p><p> import java.util.HashMap;</p><p> import java.util.List;</p><p> import java.util.
32、Map;</p><p> import java.util.Stack;</p><p> public class AssignmentExplain {</p><p><b> // 單詞符號(hào)</b></p><p> private String[] words = { "=", &
33、quot;?", "+", "-", "*", "/", "(", ")", "v", "c", "clear", "#", "N" };</p><p> private Stack
34、<WordSymbol> stack = new Stack<>(); // 歸約棧</p><p> private List<WordSymbol> wordSymbols = new ArrayList<>(); // 單詞符號(hào)</p><p> private Map<String, Integer> variable
35、s = new HashMap<>(); // 變量表</p><p> private Relation[][] relations; // 優(yōu)先關(guān)系表</p><p> private int index = 0;</p><p> public static void main(String[] args) {</p><
36、p> String str = "a=3;(a+17)/3?";</p><p> AssignmentExplain assignmentExplain = new AssignmentExplain();</p><p><b> try {</b></p><p> String[] sentence =
37、 str.split(";");</p><p> for (String inputStr : sentence) {</p><p> assignmentExplain.getDoubleGroup(inputStr);</p><p> System.out.println("\n單詞符號(hào)串:");</p&
38、gt;<p> System.out.println(assignmentExplain.wordSymbols + "\n");</p><p> assignmentExplain.startExplain(inputStr);</p><p> System.out.println("\n變量表:");</p>
39、<p> for (String key : assignmentExplain.variables.keySet()) {</p><p> System.out.println(key + ":" + assignmentExplain.variables.get(key));</p><p><b> }</b></p
40、><p><b> }</b></p><p> } catch (Exception e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p&g
41、t;<p> public void initRelation() {</p><p> relations = new Relation[12][12];</p><p> for (int i = 0; i < 12; i++) {</p><p> for (int j = 0; j < 12; j++) {</p>
42、;<p> Relation relation = new Relation();</p><p> relation.setCodeLeft(i + 1);</p><p> relation.setCodeRight(j + 1);</p><p> switch (i + 1) {</p><p><b>
43、; case 1:</b></p><p> switch (j + 1) {</p><p><b> case 1:</b></p><p><b> case 2:</b></p><p><b> case 8:</b></p>&l
44、t;p><b> case 11:</b></p><p> relation.setRelation(Relation.REL_NULL);</p><p><b> break;</b></p><p><b> case 3:</b></p><p><
45、;b> case 4:</b></p><p><b> case 5:</b></p><p><b> case 6:</b></p><p><b> case 7:</b></p><p><b> case 9:</b>
46、;</p><p><b> case 10:</b></p><p> relation.setRelation(Relation.REL_LESS);</p><p><b> break;</b></p><p><b> case 12:</b></p&g
47、t;<p> relation.setRelation(Relation.REL_GREATER);</p><p><b> break;</b></p><p><b> }</b></p><p><b> break;</b></p><p>&l
48、t;b> case 2:</b></p><p> switch (j + 1) {</p><p><b> case 12:</b></p><p> relation.setRelation(Relation.REL_GREATER);</p><p><b> break;&
49、lt;/b></p><p><b> default:</b></p><p> relation.setRelation(Relation.REL_NULL);</p><p><b> break;</b></p><p><b> }</b></p&
50、gt;<p><b> break;</b></p><p><b> case 3:</b></p><p><b> case 4:</b></p><p> switch (j + 1) {</p><p><b> case 1:<
51、;/b></p><p><b> case 11:</b></p><p> relation.setRelation(Relation.REL_NULL);</p><p><b> break;</b></p><p><b> case 2:</b><
52、;/p><p><b> case 3:</b></p><p><b> case 4:</b></p><p><b> case 8:</b></p><p><b> case 12:</b></p><p> rel
53、ation.setRelation(Relation.REL_GREATER);</p><p><b> break;</b></p><p><b> default:</b></p><p> relation.setRelation(Relation.REL_LESS);</p><p&g
54、t;<b> break;</b></p><p><b> }</b></p><p><b> break;</b></p><p><b> case 5:</b></p><p><b> case 6:</b>&l
55、t;/p><p> switch (j + 1) {</p><p><b> case 1:</b></p><p><b> case 11:</b></p><p> relation.setRelation(Relation.REL_NULL);</p><p>
56、<b> break;</b></p><p><b> case 7:</b></p><p><b> case 9:</b></p><p><b> case 10:</b></p><p> relation.setRelation(R
57、elation.REL_LESS);</p><p><b> break;</b></p><p><b> default:</b></p><p> relation.setRelation(Relation.REL_GREATER);</p><p><b> break;
58、</b></p><p><b> }</b></p><p><b> break;</b></p><p><b> case 7:</b></p><p> switch (j + 1) {</p><p><b>
59、 case 1:</b></p><p><b> case 2:</b></p><p><b> case 11:</b></p><p> relation.setRelation(Relation.REL_NULL);</p><p><b> break;&l
60、t;/b></p><p><b> case 8:</b></p><p> relation.setRelation(Relation.REL_EQUAL);</p><p><b> break;</b></p><p><b> case 12:</b>&
61、lt;/p><p> relation.setRelation(Relation.REL_GREATER);</p><p><b> break;</b></p><p><b> default:</b></p><p> relation.setRelation(Relation.REL_
62、LESS);</p><p><b> break;</b></p><p><b> }</b></p><p><b> break;</b></p><p><b> case 8:</b></p><p> swi
63、tch (j + 1) {</p><p><b> case 1:</b></p><p><b> case 7:</b></p><p><b> case 9:</b></p><p><b> case 10:</b></p>
64、<p><b> case 11:</b></p><p> relation.setRelation(Relation.REL_NULL);</p><p><b> break;</b></p><p><b> default:</b></p><p&g
65、t; relation.setRelation(Relation.REL_GREATER);</p><p><b> break;</b></p><p><b> }</b></p><p><b> break;</b></p><p><b> ca
66、se 9:</b></p><p> switch (j + 1) {</p><p><b> case 1:</b></p><p> relation.setRelation(Relation.REL_EQUAL);</p><p><b> break;</b></
67、p><p><b> case 7:</b></p><p><b> case 9:</b></p><p><b> case 10:</b></p><p><b> case 11:</b></p><p> rela
68、tion.setRelation(Relation.REL_NULL);</p><p><b> break;</b></p><p><b> default:</b></p><p> relation.setRelation(Relation.REL_GREATER);</p><p>
69、;<b> break;</b></p><p><b> }</b></p><p><b> break;</b></p><p><b> case 10:</b></p><p> switch (j + 1) {</p>
70、<p><b> case 1:</b></p><p><b> case 7:</b></p><p><b> case 9:</b></p><p><b> case 10:</b></p><p><b> cas
71、e 11:</b></p><p> relation.setRelation(Relation.REL_NULL);</p><p><b> break;</b></p><p><b> default:</b></p><p> relation.setRelation(
72、Relation.REL_GREATER);</p><p><b> break;</b></p><p><b> }</b></p><p><b> break;</b></p><p><b> case 11:</b></p>
73、;<p> switch (j + 1) {</p><p><b> case 12:</b></p><p> relation.setRelation(Relation.REL_GREATER);</p><p><b> break;</b></p><p><b
74、> default:</b></p><p> relation.setRelation(Relation.REL_NULL);</p><p><b> break;</b></p><p><b> }</b></p><p><b> break;<
75、/b></p><p><b> case 12:</b></p><p> switch (j + 1) {</p><p><b> case 12:</b></p><p> relation.setRelation(Relation.REL_EQUAL);</p>
76、<p><b> break;</b></p><p><b> default:</b></p><p> relation.setRelation(Relation.REL_LESS);</p><p><b> break;</b></p><p>&
77、lt;b> }</b></p><p><b> break;</b></p><p><b> }</b></p><p> relations[i][j] = relation;</p><p><b> }</b></p><
78、;p><b> }</b></p><p><b> }</b></p><p> // 掃描緩沖區(qū),求得二元組</p><p> public void getDoubleGroup(String inputStr) throws Exception {</p><p> word
79、Symbols.clear();</p><p> inputStr = "#" + inputStr + "#";</p><p> index = 0;</p><p> while (index < inputStr.length()) {</p><p><b> {&l
80、t;/b></p><p> String ch = "";</p><p> while ((ch = inputStr.substring(index, index + 1)).equals(" ")) {</p><p><b> index++;</b></p><
81、p> if (index >= inputStr.length())</p><p><b> break;</b></p><p><b> }</b></p><p> if (ch.equals(" ")) {</p><p><b> in
82、dex++;</b></p><p><b> continue;</b></p><p><b> }</b></p><p> if (Character.isLetter(ch.charAt(0))) {</p><p> if (!recognizeIdentifier(
83、inputStr)) {</p><p> new Exception("不能識(shí)別的標(biāo)識(shí)符");</p><p><b> }</b></p><p><b> index++;</b></p><p> } else if (Character.isDigit(ch.c
84、harAt(0))) {</p><p> if (!recognizeInteger(inputStr)) {</p><p> new Exception("不能識(shí)別的整數(shù)");</p><p><b> }</b></p><p><b> index++;</b>
85、</p><p><b> } else {</b></p><p> int code = -1;</p><p> switch (ch) {</p><p><b> case "=":</b></p><p> code = codeOf
86、Word("=");</p><p> if (code == -1)</p><p> System.out.println("找不到該單詞符號(hào)的種別碼");</p><p><b> else {</b></p><p> WordSymbol symbol = new
87、 WordSymbol(code, WordSymbol.TYPE_NULL, "-");</p><p> wordSymbols.add(symbol);</p><p><b> }</b></p><p><b> break;</b></p><p><b&
88、gt; case "?":</b></p><p> code = codeOfWord("?");</p><p> if (code == -1)</p><p> System.out.println("找不到該單詞符號(hào)的種別碼");</p><p><
89、;b> else {</b></p><p> WordSymbol symbol = new WordSymbol(code, WordSymbol.TYPE_NULL, "-");</p><p> wordSymbols.add(symbol);</p><p><b> }</b></
90、p><p><b> break;</b></p><p><b> case "+":</b></p><p> code = codeOfWord("+");</p><p> if (code == -1)</p><p>
91、 System.out.println("找不到該單詞符號(hào)的種別碼");</p><p><b> else {</b></p><p> WordSymbol symbol = new WordSymbol(code, WordSymbol.TYPE_NULL, "-");</p><p> wo
92、rdSymbols.add(symbol);</p><p><b> }</b></p><p><b> break;</b></p><p><b> case "-":</b></p><p> code = codeOfWord("
93、;-");</p><p> if (code == -1)</p><p> System.out.println("找不到該單詞符號(hào)的種別碼");</p><p><b> else {</b></p><p> WordSymbol symbol = new WordSymbo
94、l(code, WordSymbol.TYPE_NULL, "-");</p><p> wordSymbols.add(symbol);</p><p><b> }</b></p><p><b> break;</b></p><p><b> case
95、"*":</b></p><p> code = codeOfWord("*");</p><p> if (code == -1)</p><p> System.out.println("找不到該單詞符號(hào)的種別碼");</p><p><b> el
96、se {</b></p><p> WordSymbol symbol = new WordSymbol(code, WordSymbol.TYPE_NULL, "-");</p><p> wordSymbols.add(symbol);</p><p><b> }</b></p><
97、;p><b> break;</b></p><p><b> case "/":</b></p><p> code = codeOfWord("/");</p><p> if (code == -1)</p><p> System.ou
98、t.println("找不到該單詞符號(hào)的種別碼");</p><p><b> else {</b></p><p> WordSymbol symbol = new WordSymbol(code, WordSymbol.TYPE_NULL, "-");</p><p> wordSymbols.
99、add(symbol);</p><p><b> }</b></p><p><b> break;</b></p><p><b> case "(":</b></p><p> code = codeOfWord("(");
100、</p><p> if (code == -1)</p><p> System.out.println("找不到該單詞符號(hào)的種別碼");</p><p><b> else {</b></p><p> WordSymbol symbol = new WordSymbol(code, Wo
101、rdSymbol.TYPE_NULL, "-");</p><p> wordSymbols.add(symbol);</p><p><b> }</b></p><p><b> break;</b></p><p><b> case ")&qu
102、ot;:</b></p><p> code = codeOfWord(")");</p><p> if (code == -1)</p><p> System.out.println("找不到該單詞符號(hào)的種別碼");</p><p><b> else {</b
103、></p><p> WordSymbol symbol = new WordSymbol(code, WordSymbol.TYPE_NULL, "-");</p><p> wordSymbols.add(symbol);</p><p><b> }</b></p><p><
104、b> break;</b></p><p> case "clear":</p><p> code = codeOfWord("clear");</p><p> if (code == -1)</p><p> System.out.println("找不到該單
105、詞符號(hào)的種別碼");</p><p><b> else {</b></p><p> WordSymbol symbol = new WordSymbol(code, WordSymbol.TYPE_NULL, "-");</p><p> wordSymbols.add(symbol);</p>
106、;<p><b> }</b></p><p><b> break;</b></p><p><b> case "#":</b></p><p> code = codeOfWord("#");</p><p>
107、 if (code == -1)</p><p> System.out.println("找不到該單詞符號(hào)的種別碼");</p><p><b> else {</b></p><p> WordSymbol symbol = new WordSymbol(code, WordSymbol.TYPE_NULL, &
108、quot;-");</p><p> wordSymbols.add(symbol);</p><p><b> }</b></p><p><b> break;</b></p><p><b> case "N":</b></p&
109、gt;<p> code = codeOfWord("N");</p><p> if (code == -1)</p><p> System.out.println("找不到該單詞符號(hào)的種別碼");</p><p><b> else {</b></p><p
110、> WordSymbol symbol = new WordSymbol(code, WordSymbol.TYPE_NULL, "-");</p><p> wordSymbols.add(symbol);</p><p><b> }</b></p><p><b> break;</b&g
111、t;</p><p><b> default:</b></p><p> throw new Exception("無(wú)法識(shí)別的字符");</p><p><b> }</b></p><p> System.out.println("識(shí)別出界符/運(yùn)算符:&qu
112、ot; + ch);</p><p><b> index++;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b>
113、 }</b></p><p> // 識(shí)別標(biāo)識(shí)符的子程序</p><p> public boolean recognizeIdentifier(String inputStr) {</p><p> int state = 0;</p><p> String strToken = "";</p
114、><p> String ch = "";</p><p> while (index < inputStr.length()) {</p><p> ch = inputStr.substring(index, index + 1);</p><p> switch (state) {</p>&
115、lt;p><b> case 0:</b></p><p> if (Character.isLetter(ch.charAt(0))) {</p><p> state = 1;</p><p> strToken += ch;</p><p><b> index++;</b>&
116、lt;/p><p><b> } else {</b></p><p> return false;</p><p><b> }</b></p><p><b> break;</b></p><p><b> case 1:</
117、b></p><p> if (Character.isLetter(ch.charAt(0)) || Character.isDigit(ch.charAt(0))) {</p><p> strToken += ch;</p><p><b> index++;</b></p><p><b>
118、 } else {</b></p><p> state = 2;</p><p><b> index--;</b></p><p><b> }</b></p><p><b> break;</b></p><p><b
119、> case 2:</b></p><p> int code = codeOfWord("v");</p><p> if (code == -1)</p><p> System.out.println("找不到該單詞符號(hào)的種別碼");</p><p><b>
120、 else {</b></p><p> if (strToken.equals("clear"))</p><p> code = 11;</p><p> WordSymbol symbol = new WordSymbol(code, WordSymbol.TYPE_STRING, strToken);</p>
121、<p> wordSymbols.add(symbol);</p><p><b> }</b></p><p> return true;</p><p><b> }</b></p><p><b> }</b></p><p&g
122、t; return false;</p><p><b> }</b></p><p> // 識(shí)別常整數(shù)的子程序</p><p> public boolean recognizeInteger(String inputStr) {</p><p> int state = 0;</p><
123、;p> String strToken = "";</p><p> String ch = "";</p><p> while (index < inputStr.length()) {</p><p> ch = inputStr.substring(index, index + 1);</p&
124、gt;<p> switch (state) {</p><p><b> case 0:</b></p><p> if (Character.isDigit(ch.charAt(0))) {</p><p> state = 1;</p><p> strToken += ch;</p&
125、gt;<p><b> index++;</b></p><p><b> } else {</b></p><p> return false;</p><p><b> }</b></p><p><b> break;</b>
126、</p><p><b> case 1:</b></p><p> if (Character.isDigit(ch.charAt(0))) {</p><p> strToken += ch;</p><p><b> index++;</b></p><p>&
127、lt;b> } else {</b></p><p> state = 2;</p><p><b> }</b></p><p><b> break;</b></p><p><b> case 2:</b></p><p&g
128、t;<b> index--;</b></p><p> int code = codeOfWord("c");</p><p> if (code == -1)</p><p> System.out.println("找不到該單詞符號(hào)的種別碼");</p><p>&l
129、t;b> else {</b></p><p> WordSymbol symbol = new WordSymbol(code, WordSymbol.TYPE_INT, Integer.valueOf(strToken));</p><p> wordSymbols.add(symbol);</p><p><b> }<
130、;/b></p><p> return true;</p><p><b> }</b></p><p><b> }</b></p><p> return false;</p><p><b> }</b></p>&
131、lt;p> // 返回單詞符號(hào)的種別碼</p><p> public int codeOfWord(String word) {</p><p> for (int i = 0; i < words.length; i++) {</p><p> if (words[i].equals(word))</p><p>
132、return i + 1;</p><p><b> }</b></p><p> return -1;</p><p><b> }</b></p><p> public void startExplain(String inputStr) throws Exception {// 開(kāi)始
133、歸約</p><p> initRelation();</p><p> stack.clear();</p><p> int pointer = 0;</p><p> WordSymbol topWord = wordSymbols.get(pointer);</p><p> pointer++;&l
134、t;/p><p> WordSymbol rightWord;</p><p> stack.add(topWord);</p><p> while (pointer < wordSymbols.size()) {</p><p> int stackSize = stack.size();</p><p>
135、; while (--stackSize >= 0) {</p><p> if (stack.get(stackSize).getCode() != 13) {</p><p> topWord = stack.get(stackSize);</p><p><b> break;</b></p><p>
136、;<b> }</b></p><p><b> }</b></p><p> rightWord = wordSymbols.get(pointer);</p><p> System.out.println("棧:" + stack);</p><p> // Sy
137、stem.out.println("rightWord:" + rightWord);</p><p> Relation temp = relations[topWord.getCode() - 1][rightWord.getCode() - 1];</p><p> int relation = temp.getRelation();</p>&
138、lt;p> String strTemp = "";</p><p> switch (relation) {</p><p><b> case -1:</b></p><p> strTemp = "<";</p><p><b> break;
139、</b></p><p><b> case 0:</b></p><p> strTemp = "=";</p><p><b> break;</b></p><p><b> case 1:</b></p><p
140、> strTemp = ">";</p><p><b> break;</b></p><p><b> }</b></p><p> System.out.println("優(yōu)先關(guān)系:(" + temp.getCodeLeft() + ","
141、; + temp.getCodeRight() + "," + strTemp + ")");</p><p> if (relation <= 0) {</p><p> stack.add(rightWord);</p><p> if (rightWord.getCode() == 11) {</p&g
142、t;<p> variables.clear();</p><p> WordSymbol top = stack.pop();</p><p> top.setCode(13);</p><p> top.setValue("-");</p><p> stack.push(top);</p
143、><p><b> }</b></p><p> pointer++;</p><p> } else if (relation == 2) {</p><p> String str = rightWord.getValue().toString();</p><p> str = inp
144、utStr.substring(pointer, pointer + 1);</p><p> // int index = inputStr.indexOf(str);</p><p> // if(index == -1)</p><p> System.out.println("輸入串在" + str + "附近有語(yǔ)法錯(cuò)誤!
145、");</p><p> stack.clear();</p><p> variables.clear();</p><p> throw new Exception("輸入串在" + str + "附近有語(yǔ)法錯(cuò)誤!");</p><p><b> } else {<
146、/b></p><p> int leftPos, rightPos = stack.size() - 1;</p><p> leftPos = rightPos - 1;</p><p> while (stack.get(rightPos).getCode() == 13) {</p><p> rightPos--;&l
147、t;/p><p> leftPos--;</p><p><b> }</b></p><p> while (stack.get(leftPos).getCode() == 13) {</p><p> leftPos--;</p><p><b> }</b><
溫馨提示
- 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ì)--if-else條件語(yǔ)句的翻譯程序設(shè)計(jì)
- 編譯課程設(shè)計(jì)報(bào)告---for循環(huán)語(yǔ)句的翻譯程序設(shè)計(jì)
- 數(shù)字示波器gpib解釋程序設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)報(bào)告說(shuō)明書--- do-while循環(huán)語(yǔ)句的翻譯程序設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)-while循環(huán)語(yǔ)句的翻譯程序設(shè)計(jì)(lr方法、輸出四元式)
- 編譯原理課程設(shè)計(jì)---小型程序設(shè)計(jì)語(yǔ)言編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)報(bào)告-編譯程序構(gòu)造
- 編譯原理課程設(shè)計(jì)--- 詞法分析程序
- 課程設(shè)計(jì)---編譯原理實(shí)現(xiàn)對(duì)for語(yǔ)句處理的功能
- 編譯原理課程設(shè)計(jì)報(bào)告-預(yù)測(cè)分析程序的設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)報(bào)告-預(yù)測(cè)分析程序的設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)
- 微機(jī)原理課程設(shè)計(jì)----進(jìn)制轉(zhuǎn)換程序設(shè)計(jì)
- 組成原理課程設(shè)計(jì)報(bào)告---微程序設(shè)計(jì)
- 微機(jī)原理課程設(shè)計(jì)--代碼轉(zhuǎn)換程序設(shè)計(jì)
- 微機(jī)原理課程設(shè)計(jì)--加密解密程序設(shè)計(jì)
- 微機(jī)原理-課程設(shè)計(jì)電風(fēng)扇程序設(shè)計(jì)
- 編譯原理遞歸下降子程序課程設(shè)計(jì)報(bào)告
- 編譯原理課程設(shè)計(jì)--算術(shù)表達(dá)式的語(yǔ)法分析及語(yǔ)義分析程序設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論