編譯原理課程設(shè)計(jì)---賦值語(yǔ)句的解釋程序設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩31頁(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><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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論