示例#1
0
        /// <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());
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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));
        }