Jsm.LabeledStack.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using System.Collections.Generic;
  2. namespace OpenVIII.Fields.Scripts
  3. {
  4. public static partial class Jsm
  5. {
  6. #region Classes
  7. public sealed class LabeledStack : IStack<IJsmExpression>
  8. {
  9. #region Fields
  10. private readonly Dictionary<IJsmExpression, int> _positions = new Dictionary<IJsmExpression, int>();
  11. private readonly Stack<IJsmExpression> _stack = new Stack<IJsmExpression>();
  12. #endregion Fields
  13. #region Properties
  14. public int Count => _stack.Count;
  15. public int CurrentLabel { get; set; }
  16. #endregion Properties
  17. #region Methods
  18. public IJsmExpression Peek() => _stack.Peek();
  19. public bool StackEmpty() => _stack == null || _stack.Count <= 0;
  20. public IJsmExpression Pop()
  21. {
  22. //if (_stack == null || _stack.Count <= 0) return default;
  23. var result = _stack.Pop();
  24. CurrentLabel = _positions[result];
  25. _positions.Remove(result);
  26. return result;
  27. }
  28. public void Push(IJsmExpression item)
  29. {
  30. _positions.Add(item, CurrentLabel);
  31. _stack.Push(item);
  32. }
  33. #endregion Methods
  34. }
  35. #endregion Classes
  36. }
  37. }