예제 #1
0
        /// <summary>
        /// 所有的具体表达式角色都需要实现的抽象方法
        /// 这个方法为虚方法,并非抽象方法,为了代码复用
        /// </summary>
        /// <param name="context">环境角色</param>
        public virtual void Interpret(ContextcnNum context)
        {
            //如果要处理的字符串长度为0则返回
            if (context.statement.Length == 0)
            {
                return;
            }
            foreach (string key in table.Keys)
            {
                int value = table[key];
                if (context.statement.EndsWith(key + GetPostifix()))
                {
                    context.data     += value * Multiplier();
                    context.statement = context.statement.Substring(0, context.statement.Length - this.GetLength());
                    break;
                }

                if (context.statement.EndsWith("零"))
                {
                    context.statement = context.statement.Substring(0, context.statement.Length - 1);
                    break;
                }
                if (context.statement.Length == 0)
                {
                    return;
                }
            }
        }
예제 #2
0
        public static void ShowDemo()
        {
            Console.WriteLine("===== 处理 汉字数字大小写转换 的例子 =====");

            string       roman   = "伍千肆百参拾贰"; //5432
            ContextcnNum context = new ContextcnNum(roman);
            //构造抽象语法树
            List <Expression> tree = new List <Expression>();

            //加入终结符表达式
            //如果能直接转换成数字则直接返回
            tree.Add(new NumTerminalExpression());
            //非终结符,处理个位数
            tree.Add(new NonterminalOneExpression());
            //非终结符,处理十位数
            tree.Add(new NonterminalTenExpression());
            //非终结符,处理百位数
            tree.Add(new NonterminalHundredExpression());
            //非终结器,处理千位数
            tree.Add(new NonterminalThousandExpression());

            //对抽象语法树的每个枝节进行解释操作
            foreach (Expression exp in tree)
            {
                exp.Interpret(context);
            }
            Console.WriteLine("{0} = {1}", roman, context.data);
        }
예제 #3
0
        /// <summary>
        /// 重写解释方法
        /// </summary>
        /// <param name="context">环境角色</param>
        public override void Interpret(ContextcnNum context)
        {
            int i = 0;

            try
            {
                i = int.Parse(context.statement);
                //如果是数字则说明能够直接转换
                //也就是说用不到非终结表达式角色
                context.statement = "";
                context.data      = i;
            }
            catch
            {
                //说明输入的是汉字数字,不做任何处理
            }
        }