Interpreter+インタプリタモード(動作モード)

16269 ワード

 public abstract class Expression
    {
        protected Dictionary<string, int> table = new Dictionary<string, int>( 9 );
        public Expression()
        {
            table.Add( " ", 1 );
            table.Add( " ", 2 );
            table.Add( " ", 3 );
            table.Add( " ", 4 );
            table.Add( " ", 5 );
            table.Add( " ", 6 );
            table.Add( " ", 7 );
            table.Add( " ", 8 );
            table.Add( " ", 9 );
        }
        public virtual void Interpret( Context context )
        {
            if( context.Statement.Length == 0 )
            {
                return;
            }
            foreach( string key in table.Keys )
            {
                int value = table[ key ];
                if( context.Statement.EndsWith( key + GetPostfix() ) )
                {
                    context.Data += value * this.Mutiplier();
                    context.Statement = context.Statement.Substring( 0, context.Statement.Length - this.GetLenght() );
                }
                if( context.Statement.EndsWith( " " ) )
                {
                    context.Statement = context.Statement.Substring( 0, context.Statement.Length - 1 );
                }
            }
        }

        public virtual int GetLenght()
        {
            return this.GetPostfix().Length + 1;
        }

        public abstract int Mutiplier();
        public abstract string GetPostfix();
    }

 
  public class GeExpression:Expression
    {
        public override int Mutiplier()
        {
            return 1;
        }

        public override string GetPostfix()
        {
            return "";
        }

        public override int GetLenght()
        {
            return 1;
        }
    }
 public class ShiExpression:Expression
    {
        public override int Mutiplier()
        {
            return 10;
        }

        public override string GetPostfix()
        {
            return " ";
        }
    }
 public class BaiExpression:Expression
    {
        public override int Mutiplier()
        {
            return 100;
        }

        public override string GetPostfix()
        {
            return " ";
        }
    }
  public class QianExpression:Expression
    {
        public override int Mutiplier()
        {
            return 1000;
        }

        public override string GetPostfix()
        {
            return " ";
        }
    }
  public class WanExpression:Expression
    {
        public override int Mutiplier()
        {
            return 10000;
        }

        public override string GetPostfix()
        {
            return " ";
        }
        public override void Interpret( Context context )
        {
            if( context.Statement.Length == 0 )
            {
                return;
            }
            ArrayList tree = new ArrayList();
            tree.Add( new GeExpression() );
            tree.Add( new ShiExpression() );
            tree.Add( new BaiExpression() );
            tree.Add( new QianExpression() );

            foreach( string key in table.Keys )
            {
                if( context.Statement.EndsWith( this.GetPostfix() ) )
                {
                    int temp = context.Data;
                    context.Data = 0;

                    context.Statement = context.Statement.Substring( 0, context.Statement.Length - 1 );

                    foreach( Expression exp in tree )
                    {
                        exp.Interpret( context );
                    }
                    context.Data = temp + this.Mutiplier() * context.Data;
                }
            }
        }

    }
  static void Main( string[] args )
        {
            string roman = " ";
            Context context = new Context( roman );

            ArrayList tree = new ArrayList();
            tree.Add( new GeExpression() );
            tree.Add( new ShiExpression() );
            tree.Add( new BaiExpression() );
            tree.Add( new QianExpression() );
            tree.Add( new WanExpression() );

            foreach( Expression exp in tree )
            {
                exp.Interpret( context );                
            }

            Console.WriteLine( "{0} = {1}", roman, context.Data );
        }

 
 public class Context
    {
        public Context( string roman )
        {
            this.Statement = roman;
        }
        public int Data;
        public string Statement;
    }

ちょっと難しいですが、再帰的に処理し続け、解釈器で処理し続けます.