PageRenderTime 39ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/SimpleBrainFuck.Core/Core/SemanticTree.cs

http://ironbrainfuck.codeplex.com
C# | 242 lines | 193 code | 49 blank | 0 comment | 17 complexity | eac0873a1ecc02532fa64212b1330bca MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. namespace ZackFlame.SimpleBrainFuck.Core.Statments
  7. {
  8. public abstract class Statment
  9. {
  10. public int Line { get; set; }
  11. }
  12. public class BrainIf : Statment
  13. {
  14. public BrainArg Parameter { get; set; }
  15. public LinkedList<Statment> IfStatments { get; set; }
  16. public LinkedList<Statment> ElseStatments { get; set; }
  17. public BrainIf()
  18. {
  19. IfStatments = new LinkedList<Statment>();
  20. ElseStatments = new LinkedList<Statment>();
  21. }
  22. public override string ToString()
  23. {
  24. return string.Format("if {0}",
  25. Parameter != null ? Parameter.ToString() : "???");
  26. }
  27. }
  28. public class BrainDef : Statment
  29. {
  30. internal static readonly Regex NameRegex = new Regex("^[a-zA-Z_]+[a-zA-Z_0-9]*$");
  31. private string name;
  32. private Func<string[], string> renderer;
  33. public string Name
  34. {
  35. get { return name; }
  36. set
  37. {
  38. if (value == null)
  39. throw new ArgumentNullException();
  40. name = value;
  41. }
  42. }
  43. public List<BrainMacros> MacrosArgs { get; set; }
  44. public LinkedList<Statment> Statments { get; set; }
  45. public bool CanRenderItself
  46. {
  47. get { return renderer != null; }
  48. }
  49. public BrainDef(Func<string[], string> renderer)
  50. : this()
  51. {
  52. this.renderer = renderer;
  53. }
  54. public BrainDef()
  55. {
  56. MacrosArgs = new List<BrainMacros>();
  57. Statments = new LinkedList<Statment>();
  58. }
  59. public string Render(string[] parameters)
  60. {
  61. if (renderer == null)
  62. throw new NotSupportedException();
  63. return renderer(parameters);
  64. }
  65. public override string ToString()
  66. {
  67. return string.Format(
  68. "def {0} ({1} params)",
  69. Name,
  70. MacrosArgs != null ? MacrosArgs.Count.ToString() : "???");
  71. }
  72. }
  73. public class BrainCall : Statment
  74. {
  75. private string defName = string.Empty;
  76. public string DefName
  77. {
  78. get { return defName; }
  79. set
  80. {
  81. if (value == null)
  82. throw new ArgumentNullException();
  83. defName = value;
  84. }
  85. }
  86. public List<BrainArg> CallArgs { get; private set; }
  87. public BrainCall()
  88. {
  89. CallArgs = new List<BrainArg>();
  90. }
  91. public override string ToString()
  92. {
  93. return string.Format("${0} ({1} args)", DefName, CallArgs.Count);
  94. }
  95. }
  96. public class BrainArg : Statment
  97. {
  98. private string value = string.Empty;
  99. public string Value
  100. {
  101. get { return this.value; }
  102. set
  103. {
  104. if (value == null)
  105. throw new ArgumentNullException();
  106. this.value = value;
  107. }
  108. }
  109. public override string ToString()
  110. {
  111. return string.Format("\"{0}\"", value);
  112. }
  113. }
  114. public class BrainMacros : BrainArg
  115. {
  116. internal static readonly Regex NameRegex = new Regex("^(-)?([a-zA-Z_]+[a-zA-Z_~0-9]*)$");
  117. private string name;
  118. public string Name
  119. {
  120. get { return name; }
  121. set
  122. {
  123. if (value == null)
  124. throw new ArgumentNullException();
  125. name = value;
  126. }
  127. }
  128. public bool Negative { get; set; }
  129. public BrainMacros()
  130. : this(string.Empty)
  131. {
  132. }
  133. public BrainMacros(string name)
  134. {
  135. this.name = name;
  136. }
  137. public override string ToString()
  138. {
  139. return string.Format("@{0}", Name);
  140. }
  141. }
  142. public class BrainMacrosAssignment : BrainMacros
  143. {
  144. public BrainMacrosExpression Expression { get; set; }
  145. public BrainMacrosAssignment()
  146. : base()
  147. {
  148. }
  149. public BrainMacrosAssignment(string name)
  150. : base(name)
  151. {
  152. }
  153. public override string ToString()
  154. {
  155. return string.Format(
  156. "@{0} = {1}",
  157. Name,
  158. Expression != null ? Expression.ToString() : "???");
  159. }
  160. }
  161. public class BrainMacrosExpression
  162. {
  163. public BrainArg Left { get; set; }
  164. public BrainArg Right { get; set; }
  165. public string Operator { get; set; }
  166. public override string ToString()
  167. {
  168. return string.Format(
  169. "{0} {1}{2}",
  170. Left,
  171. Operator ?? "???",
  172. Right != null ? " " + Right.ToString() : string.Empty);
  173. }
  174. }
  175. public class BrainPureCode : Statment
  176. {
  177. private string value = string.Empty;
  178. public string Value
  179. {
  180. get { return value; }
  181. set
  182. {
  183. if (value == null)
  184. throw new ArgumentNullException();
  185. this.value = value;
  186. }
  187. }
  188. public override string ToString()
  189. {
  190. return value;
  191. }
  192. }
  193. }