使用继承

#region Using directives

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

#endregion

namespace Tokenizer
{
    partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Open_Click(object sender, EventArgs e)
        {
            // to do
            SourceFile source = new SourceFile();
            ColorSyntaxVisitor visitor = new ColorSyntaxVisitor(codeText);
            source.Accept(visitor);

        }
    }
}

namespace Tokenizer
{
 class SourceFile : IVisitable //实现Ivisitabletoken 接口
 {
        public void Accept(ITokenVisitor visitor)
        {
            foreach(IVisitableToken token in tokens)
            {
                token.Accept(visitor);
            }
        }
        //数组中包含了一系列的对象了 共同实现了IVisitabletoken 接口。动态的构造了各种token
        //accept 方法有个ITOkenvisitor 类型的参数,遍历各个token,调用他们的acceppt方法


  private IVisitableToken[] tokens =
  {
            new KeywordToken("using"),
            new WhitespaceToken(" "),
            new IdentifierToken("System"),
            new PunctuatorToken(";"),
            new WhitespaceToken("/n"),
            new WhitespaceToken("/n"),
   new KeywordToken("class"),
   new WhitespaceToken(" "),
   new IdentifierToken("Greeting"),
   new WhitespaceToken("/n"),
   new PunctuatorToken("{"),
   new WhitespaceToken("/n"),
   new WhitespaceToken("    "),
   new KeywordToken("static"),
   new WhitespaceToken(" "),
   new KeywordToken("void"),
   new WhitespaceToken(" "),
   new IdentifierToken("Main"),
   new PunctuatorToken("("),
   new PunctuatorToken(")"),
   new WhitespaceToken("/n"),
   new WhitespaceToken("    "),
   new PunctuatorToken("{"),
   new WhitespaceToken("/n"),
   new WhitespaceToken("        "),
   new IdentifierToken("Console"),
   new OperatorToken("."),
   new IdentifierToken("WriteLine"),
   new PunctuatorToken("("),
   new StringLiteralToken("/"Hello, world/""),
   new PunctuatorToken(")"),
   new PunctuatorToken(";"),
   new WhitespaceToken("/n"),
   new WhitespaceToken("    "),
   new PunctuatorToken("}"),
   new WhitespaceToken("/n"),
   new PunctuatorToken("}"),
  };
 }

 class IdentifierToken : DefaultTokenImpl, IVisitableToken
       //实现了accept 方法

 {
  public IdentifierToken(string name)
   : base(name)
  {
  }

  void IVisitable.Accept(ITokenVisitor visitor)
  {
   visitor.VisitIdentifier(this.ToString());
  }
 }

 class KeywordToken : DefaultTokenImpl, IVisitableToken
 {
  public KeywordToken(string name)
   : base(name)
  {
  }

  void IVisitable.Accept(ITokenVisitor visitor)
  {
   visitor.VisitKeyword(this.ToString());
  }
 }

 class WhitespaceToken : DefaultTokenImpl, IVisitableToken
 {
  public WhitespaceToken(string name)
   : base(name)
  {
  }

  void IVisitable.Accept(ITokenVisitor visitor)
  {
   visitor.VisitWhitespace(this.ToString());
  }
 }

 class PunctuatorToken : DefaultTokenImpl, IVisitableToken
 {
  public PunctuatorToken(string name)
   : base(name)
  {
  }

  void IVisitable.Accept(ITokenVisitor visitor)
  {
   visitor.VisitPunctuator(this.ToString());
  }
 }

 class OperatorToken : DefaultTokenImpl, IVisitableToken
 {
  public OperatorToken(string name)
   : base(name)
  {
  }

  void IVisitable.Accept(ITokenVisitor visitor)
  {
   visitor.VisitOperator(this.ToString());
  }
 }

 class StringLiteralToken : DefaultTokenImpl, IVisitableToken
 {
  public StringLiteralToken(string name)
   : base(name)
  {
  }

  void IVisitable.Accept(ITokenVisitor visitor)
  {
   visitor.VisitStringLiteral(this.ToString());
  }
 }
}

//

namespace Tokenizer
{
    using System;
 using System.Windows.Forms;
 using System.Drawing;

    sealed class ColorSyntaxVisitor : ITokenVisitor// mifengleiDefaultTokenImpl, IVisitableToken
    {
        public ColorSyntaxVisitor(RichTextBox rtb)
        {
            this.target = rtb;
            this.target.Clear();
            this.index = 0;
        }

  // to do: implement all the Visit methods       

  private readonly RichTextBox target;
  private int index;
        private void Write(string token, Color color)
        {
            target.AppendText(token );
            target.Select(this.index ,this .index +token .Length);
            this.index += token.Length;
            target.SelectionColor = color;// SelectionColor(color);

        }
        void ITokenVisitor.VisitComment(string token)
        {
            Write(token,Color.Black);
        }
        void ITokenVisitor.VisitIdentifier(string token)
        {
            Write(token ,Color.Black);
        }
        void ITokenVisitor.VisitKeyword(string token)
        {
            Write(token ,Color .Blue);
        }
        void ITokenVisitor.VisitOperator(string token)
        {
            Write(token ,Color .Black);
        }
        void ITokenVisitor.VisitPunctuator(string token)
        {
            Write(token ,Color .Black);
        }
        void ITokenVisitor.VisitStringLiteral(string token)
        {
            Write(token, Color.Green);
        }
        void ITokenVisitor.VisitWhitespace(string token)
        {
            Write(token, Color.Black);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值