⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scanner.cs

📁 how to create a compiler
💻 CS
字号:
using Collections = System.Collections.Generic;
using IO = System.IO;
using Text = System.Text;

public sealed class Scanner
{
	private readonly Collections.IList<object> result;

    public Scanner(IO.TextReader input)
	{
		this.result = new Collections.List<object>();
		this.Scan(input);
	}

	public Collections.IList<object> Tokens
	{
		get { return this.result; }
	}

    #region ArithmiticConstants

    // Constants to represent arithmitic tokens. This could
    // be alternatively written as an enum.
    public static readonly object Add = new object();
    public static readonly object Sub = new object();
    public static readonly object Mul = new object();
    public static readonly object Div = new object();
    public static readonly object Semi = new object();
    public static readonly object Equal = new object();

    #endregion

	private void Scan(IO.TextReader input)
	{
		while (input.Peek() != -1)
		{
			char ch = (char)input.Peek();

            // Scan individual tokens
			if (char.IsWhiteSpace(ch))
			{
				// eat the current char and skip ahead!
				input.Read();
			}
			else if (char.IsLetter(ch) || ch == '_')
			{
				// keyword or identifier

				Text.StringBuilder accum = new Text.StringBuilder();

				while (char.IsLetter(ch) || ch == '_')
				{
					accum.Append(ch);
					input.Read();

					if (input.Peek() == -1)
					{
						break;
					}
					else
					{
						ch = (char)input.Peek();
					}
				}

				this.result.Add(accum.ToString());
			}
            else if (ch == '"')
			{
				// string literal
				Text.StringBuilder accum = new Text.StringBuilder();

				input.Read(); // skip the '"'

                if (input.Peek() == -1)
				{
					throw new System.Exception("unterminated string literal");
				}

				while ((ch = (char)input.Peek()) != '"')
				{
					accum.Append(ch);
					input.Read();

					if (input.Peek() == -1)
					{
						throw new System.Exception("unterminated string literal");
					}
				}

				// skip the terminating "
				input.Read();
				this.result.Add(accum);
			}
			else if (char.IsDigit(ch))
			{
				// numeric literal

				Text.StringBuilder accum = new Text.StringBuilder();

				while (char.IsDigit(ch))
				{
					accum.Append(ch);
					input.Read();

					if (input.Peek() == -1)
					{
						break;
					}
					else
					{
						ch = (char)input.Peek();
					}
				}

				this.result.Add(int.Parse(accum.ToString()));
			}
			else switch (ch)
			{
				case '+':
					input.Read();
					this.result.Add(Scanner.Add);
					break;

				case '-':
					input.Read();
					this.result.Add(Scanner.Sub);
					break;

				case '*':
					input.Read();
					this.result.Add(Scanner.Mul);
					break;

				case '/':
					input.Read();
					this.result.Add(Scanner.Div);
					break;

				case '=':
					input.Read();
					this.result.Add(Scanner.Equal);
					break;

				case ';':
					input.Read();
					this.result.Add(Scanner.Semi);
					break;

				default:
					throw new System.Exception("Scanner encountered unrecognized character '" + ch + "'");
			}

        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -