Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- namespace CCalc
- {
- public class Token
- {
- public enum TokenKind
- {
- BadToken,
- NumberToken,
- AddOperatorToken,
- SubOperatorToken,
- MulOperatorToken,
- DivOperatorToken,
- EndOfLineToken,
- LeftParenToken,
- RightParenToken,
- };
- public double value;
- public TokenKind kind;
- public Token(TokenKind kind, double value)
- {
- this.kind = kind;
- this.value = value;
- }
- public Token(TokenKind kind)
- {
- this.kind = kind;
- this.value = 0;
- }
- }
- public class Lexer : IEnumerable<Token>
- {
- private enum LexerStatus
- {
- InitialStatus, InIntPartStatus, DotStatus, InFracPartStatus
- };
- private string line;
- public IEnumerator<Token> tokenizer;
- public Token aheadToken;
- public Lexer(string line)
- {
- this.line = line;
- this.tokenizer = this.GetEnumerator();
- }
- IEnumerator IEnumerable.GetEnumerator()
- {
- return this.GetEnumerator();
- }
- public void UnGetToken(Token token)
- {
- this.aheadToken = token;
- }
- public Token GetToken()
- {
- this.MoveNext();
- return this.Current;
- }
- public bool MoveNext()
- {
- if (this.aheadToken != null)
- {
- return true;
- }
- else
- {
- return this.tokenizer.MoveNext();
- }
- }
- public Token Current
- {
- get
- {
- if (this.aheadToken != null)
- {
- Token token = aheadToken;
- aheadToken = null;
- return token;
- }
- else
- {
- return this.tokenizer.Current;
- }
- }
- }
- public IEnumerator<Token> GetEnumerator()
- {
- LexerStatus lexerStatus = LexerStatus.InitialStatus;
- string strReturn = string.Empty;
- foreach (char ch in line)
- {
- if ((lexerStatus == LexerStatus.InIntPartStatus || lexerStatus == LexerStatus.InFracPartStatus) && !char.IsDigit(ch) && ch != '.')
- {
- if (strReturn != string.Empty)
- {
- double value = double.Parse(strReturn);
- strReturn = string.Empty;
- yield return new Token(Token.TokenKind.NumberToken, value);
- }
- }
- if (char.IsWhiteSpace(ch))
- {
- if (ch == '\n')
- {
- yield return new Token(Token.TokenKind.EndOfLineToken);
- }
- }
- if (ch == '+')
- {
- yield return new Token(Token.TokenKind.AddOperatorToken);
- }
- else if (ch == '-')
- {
- yield return new Token(Token.TokenKind.SubOperatorToken);
- }
- else if (ch == '*')
- {
- yield return new Token(Token.TokenKind.MulOperatorToken);
- }
- else if (ch == '/')
- {
- yield return new Token(Token.TokenKind.DivOperatorToken);
- }
- else if (ch == '(')
- {
- yield return new Token(Token.TokenKind.LeftParenToken);
- }
- else if (ch == ')')
- {
- yield return new Token(Token.TokenKind.RightParenToken);
- }
- else if (char.IsDigit(ch))
- {
- if (lexerStatus == LexerStatus.InitialStatus)
- {
- lexerStatus = LexerStatus.InIntPartStatus;
- }
- else if (lexerStatus == LexerStatus.DotStatus)
- {
- lexerStatus = LexerStatus.InFracPartStatus;
- }
- strReturn += ch;
- }
- else if (ch == '.')
- {
- if (lexerStatus == LexerStatus.InIntPartStatus)
- {
- lexerStatus = LexerStatus.DotStatus;
- }
- strReturn += ch;
- }
- else
- {
- yield return new Token(Token.TokenKind.BadToken);
- }
- }
- yield return new Token(Token.TokenKind.EndOfLineToken);
- }
- }
- }
Add Comment
Please, Sign In to add comment