/// <summary> /// 操作符入栈 /// </summary> /// <param name="node"></param> private void dealOperator(LinkNode node) { list.remove(node); while (stack.Count != 0 && priorities[(int)((Word)stack.Peek()).wordType, (int)node.getWord().wordType] == 1) { Word word = (Word)stack.Pop(); suffixList.add(new LinkNode(word)); } stack.Push(node.getWord()); }
/// <summary> /// 扫描list产生后缀表达式 /// </summary> internal LinkList createSuffixExpression() { if (list.Count == 0) { throw new Exception("表达式元素个数为零"); } suffixList = new LinkList(); stack.Clear(); LinkNode node = list.First; while (node != null) { LinkNode next = node.Next;; switch (node.getWord().wordType) { case WordType.Number: list.remove(node); suffixList.add(node); break; case WordType.Plus: dealOperator(node); break; case WordType.Minus: dealOperator(node); break; case WordType.Mul: dealOperator(node); break; case WordType.Div: dealOperator(node); break; case WordType.Power: dealOperator(node); break; case WordType.Leftp: dealOperator(node); break; case WordType.Rightp: dealRight(node); break; default: break; } node = next; } //弹出在栈中剩余的元素 while (stack.Count != 0) { Word word = (Word)stack.Pop(); if (word.wordType == WordType.Leftp) { throw new Exception("在括号(匹配错误"); } suffixList.add(new LinkNode(word)); } return(suffixList); }
/// <summary> /// 单词扫描完成后,将单词加入到list中 /// </summary> /// <param name="state"></param> private void addToList(int state) { Word w; //要加入到链表的单词 switch (state) { case 1: w = new Word(WordType.Identifier, makeString(strToken)); break; case 3: w = new Word(WordType.IdentifierWithDot, makeString(strToken)); break; //带点的标识符 case 4: w = new Word(WordType.Plus, makeString(strToken)); break; case 5: w = new Word(WordType.Minus, makeString(strToken)); break; case 6: w = new Word(WordType.Number, makeString(strToken)); break; case 8: w = new Word(WordType.Number, makeString(strToken)); break; case 11: w = new Word(WordType.Number, makeString(strToken)); break; case 12: w = new Word(WordType.Mul, makeString(strToken)); break; case 13: w = new Word(WordType.Div, makeString(strToken)); break; case 14: w = new Word(WordType.Leftp, makeString(strToken)); break; case 15: w = new Word(WordType.Rightp, makeString(strToken)); break; case 17: w = new Word(WordType.Comma, makeString(strToken)); break; case 18: w = new Word(WordType.Power, makeString(strToken)); break; default: throw new Exception("接收状态编码错误"); } list.add(new LinkNode(w)); }