Guest User

Untitled

a guest
May 27th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.85 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5.  
  6. namespace CCalc
  7. {
  8. public class Token
  9. {
  10. public enum TokenKind
  11. {
  12. BadToken,
  13. NumberToken,
  14. AddOperatorToken,
  15. SubOperatorToken,
  16. MulOperatorToken,
  17. DivOperatorToken,
  18. EndOfLineToken,
  19. LeftParenToken,
  20. RightParenToken,
  21. };
  22.  
  23. public double value;
  24. public TokenKind kind;
  25.  
  26. public Token(TokenKind kind, double value)
  27. {
  28. this.kind = kind;
  29. this.value = value;
  30. }
  31.  
  32. public Token(TokenKind kind)
  33. {
  34. this.kind = kind;
  35. this.value = 0;
  36. }
  37. }
  38.  
  39. public class Lexer : IEnumerable<Token>
  40. {
  41. private enum LexerStatus
  42. {
  43. InitialStatus, InIntPartStatus, DotStatus, InFracPartStatus
  44. };
  45.  
  46. private string line;
  47. public IEnumerator<Token> tokenizer;
  48. public Token aheadToken;
  49.  
  50. public Lexer(string line)
  51. {
  52. this.line = line;
  53. this.tokenizer = this.GetEnumerator();
  54. }
  55.  
  56. IEnumerator IEnumerable.GetEnumerator()
  57. {
  58. return this.GetEnumerator();
  59. }
  60.  
  61. public void UnGetToken(Token token)
  62. {
  63. this.aheadToken = token;
  64. }
  65.  
  66. public Token GetToken()
  67. {
  68. this.MoveNext();
  69. return this.Current;
  70. }
  71.  
  72. public bool MoveNext()
  73. {
  74. if (this.aheadToken != null)
  75. {
  76. return true;
  77. }
  78. else
  79. {
  80. return this.tokenizer.MoveNext();
  81. }
  82. }
  83.  
  84. public Token Current
  85. {
  86. get
  87. {
  88. if (this.aheadToken != null)
  89. {
  90. Token token = aheadToken;
  91. aheadToken = null;
  92. return token;
  93. }
  94. else
  95. {
  96. return this.tokenizer.Current;
  97. }
  98. }
  99. }
  100.  
  101. public IEnumerator<Token> GetEnumerator()
  102. {
  103. LexerStatus lexerStatus = LexerStatus.InitialStatus;
  104. string strReturn = string.Empty;
  105.  
  106. foreach (char ch in line)
  107. {
  108. if ((lexerStatus == LexerStatus.InIntPartStatus || lexerStatus == LexerStatus.InFracPartStatus) && !char.IsDigit(ch) && ch != '.')
  109. {
  110. if (strReturn != string.Empty)
  111. {
  112. double value = double.Parse(strReturn);
  113. strReturn = string.Empty;
  114. yield return new Token(Token.TokenKind.NumberToken, value);
  115. }
  116. }
  117.  
  118. if (char.IsWhiteSpace(ch))
  119. {
  120. if (ch == '\n')
  121. {
  122. yield return new Token(Token.TokenKind.EndOfLineToken);
  123. }
  124. }
  125.  
  126. if (ch == '+')
  127. {
  128. yield return new Token(Token.TokenKind.AddOperatorToken);
  129. }
  130. else if (ch == '-')
  131. {
  132. yield return new Token(Token.TokenKind.SubOperatorToken);
  133. }
  134. else if (ch == '*')
  135. {
  136. yield return new Token(Token.TokenKind.MulOperatorToken);
  137. }
  138. else if (ch == '/')
  139. {
  140. yield return new Token(Token.TokenKind.DivOperatorToken);
  141. }
  142. else if (ch == '(')
  143. {
  144. yield return new Token(Token.TokenKind.LeftParenToken);
  145. }
  146. else if (ch == ')')
  147. {
  148. yield return new Token(Token.TokenKind.RightParenToken);
  149. }
  150. else if (char.IsDigit(ch))
  151. {
  152. if (lexerStatus == LexerStatus.InitialStatus)
  153. {
  154. lexerStatus = LexerStatus.InIntPartStatus;
  155. }
  156. else if (lexerStatus == LexerStatus.DotStatus)
  157. {
  158. lexerStatus = LexerStatus.InFracPartStatus;
  159. }
  160. strReturn += ch;
  161. }
  162. else if (ch == '.')
  163. {
  164. if (lexerStatus == LexerStatus.InIntPartStatus)
  165. {
  166. lexerStatus = LexerStatus.DotStatus;
  167. }
  168. strReturn += ch;
  169. }
  170. else
  171. {
  172. yield return new Token(Token.TokenKind.BadToken);
  173. }
  174. }
  175. yield return new Token(Token.TokenKind.EndOfLineToken);
  176. }
  177. }
  178. }
Add Comment
Please, Sign In to add comment