#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);
}
}
}