六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 46|回复: 0

五个类,解析单双引号

[复制链接]

升级  16.67%

21

主题

21

主题

21

主题

秀才

Rank: 2

积分
75
 楼主| 发表于 2013-1-27 05:48:00 | 显示全部楼层 |阅读模式
public interface IBlock    {        string Quote();        void Append(char c);        bool ShouldAppendQuotedBlock(char c);    }

    public abstract class NestedBlock : IBlock    {        private readonly NestedBlock parent;        private readonly List<IBlock> blocks;        private IBlock currentBlock;        public NestedBlock(NestedBlock parent)        {            this.parent = parent;            blocks = new List<IBlock>();        }        public virtual string Quote()        {            StringBuilder stringBuilder = new StringBuilder();            foreach (IBlock block in blocks)            {                stringBuilder.Append(block.Quote());            }            return stringBuilder.ToString();        }        public abstract void Append(char c);        public abstract bool ShouldAppendQuotedBlock(char c);        protected NestedBlock Parent        {            get { return parent; }        }        protected IBlock CurrentBlock        {            get { return currentBlock; }        }        public void AppendBlock(IBlock block)        {            blocks.Add(block);            currentBlock = block;        }    }
    public class QuotedBlock : NestedBlock    {        private readonly IQuoteStrategy quoteStrategy;        private readonly char expectedQuote;        public QuotedBlock(IQuoteStrategy quoteStrategy, char expectedQuote, NestedBlock parent) : base(parent)        {            this.quoteStrategy = quoteStrategy;            this.expectedQuote = expectedQuote;            AppendBlock(new RootBlock(quoteStrategy));        }        public override string Quote()        {            return expectedQuote + quoteStrategy.Quote(base.Quote()) + expectedQuote;        }        public override void Append(char c)        {            if (c == expectedQuote)            {                Parent.AppendBlock(new UnquotedBlock());            }            else            {                CurrentBlock.Append(c);            }        }        public override bool ShouldAppendQuotedBlock(char c)        {            return false;        }    }
    public class UnquotedBlock : IBlock    {        private readonly StringBuilder stringBuilder = new StringBuilder();        public string Quote()        {            return stringBuilder.ToString();        }        public void Append(char c)        {            stringBuilder.Append(c);        }        public bool ShouldAppendQuotedBlock(char c)        {            return IsQuotationMark(c);        }        private static bool IsQuotationMark(char c)        {            if (c == '"')            {                return true;            }            return c == '\'';        }    }
   public class RootBlock : NestedBlock    {        private readonly IQuoteStrategy quoteStrategy;        public RootBlock(IQuoteStrategy quoteStrategy) : base(null)        {            this.quoteStrategy = quoteStrategy;            AppendBlock(new UnquotedBlock());        }        public override void Append(char c)        {            if (CurrentBlock.ShouldAppendQuotedBlock(c))            {                AppendBlock(new QuotedBlock(quoteStrategy, c, this));            }            else            {                CurrentBlock.Append(c);            }        }        public override bool ShouldAppendQuotedBlock(char c)        {            throw new ViScriptSystemException();        }    }
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表