debugging.odin 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package regex_parser
  2. /*
  3. (c) Copyright 2024 Feoramund <[email protected]>.
  4. Made available under Odin's BSD-3 license.
  5. List of contributors:
  6. Feoramund: Initial implementation.
  7. */
  8. import "core:io"
  9. write_node :: proc(w: io.Writer, node: Node) {
  10. switch specific in node {
  11. case ^Node_Rune:
  12. io.write_rune(w, specific.data)
  13. case ^Node_Rune_Class:
  14. io.write_byte(w, '[')
  15. if specific.negating {
  16. io.write_byte(w, '^')
  17. }
  18. for r in specific.data.runes {
  19. io.write_rune(w, r)
  20. }
  21. for range in specific.data.ranges {
  22. io.write_rune(w, range.lower)
  23. io.write_byte(w, '-')
  24. io.write_rune(w, range.upper)
  25. }
  26. io.write_byte(w, ']')
  27. case ^Node_Wildcard:
  28. io.write_byte(w, '.')
  29. case ^Node_Concatenation:
  30. io.write_rune(w, '「')
  31. for subnode, i in specific.nodes {
  32. if i != 0 {
  33. io.write_rune(w, '⋅')
  34. }
  35. write_node(w, subnode)
  36. }
  37. io.write_rune(w, '」')
  38. case ^Node_Repeat_Zero:
  39. write_node(w, specific.inner)
  40. io.write_byte(w, '*')
  41. case ^Node_Repeat_Zero_Non_Greedy:
  42. write_node(w, specific.inner)
  43. io.write_string(w, "*?")
  44. case ^Node_Repeat_One:
  45. write_node(w, specific.inner)
  46. io.write_byte(w, '+')
  47. case ^Node_Repeat_One_Non_Greedy:
  48. write_node(w, specific.inner)
  49. io.write_string(w, "+?")
  50. case ^Node_Repeat_N:
  51. write_node(w, specific.inner)
  52. if specific.lower == 0 && specific.upper == -1 {
  53. io.write_byte(w, '*')
  54. } else if specific.lower == 1 && specific.upper == -1 {
  55. io.write_byte(w, '+')
  56. } else {
  57. io.write_byte(w, '{')
  58. io.write_int(w, specific.lower)
  59. io.write_byte(w, ',')
  60. io.write_int(w, specific.upper)
  61. io.write_byte(w, '}')
  62. }
  63. case ^Node_Alternation:
  64. io.write_rune(w, '《')
  65. write_node(w, specific.left)
  66. io.write_byte(w, '|')
  67. write_node(w, specific.right)
  68. io.write_rune(w, '》')
  69. case ^Node_Optional:
  70. io.write_rune(w, '〈')
  71. write_node(w, specific.inner)
  72. io.write_byte(w, '?')
  73. io.write_rune(w, '〉')
  74. case ^Node_Optional_Non_Greedy:
  75. io.write_rune(w, '〈')
  76. write_node(w, specific.inner)
  77. io.write_string(w, "??")
  78. io.write_rune(w, '〉')
  79. case ^Node_Group:
  80. io.write_byte(w, '(')
  81. if !specific.capture {
  82. io.write_string(w, "?:")
  83. }
  84. write_node(w, specific.inner)
  85. io.write_byte(w, ')')
  86. case ^Node_Anchor:
  87. io.write_byte(w, '^' if specific.start else '$')
  88. case ^Node_Word_Boundary:
  89. io.write_string(w, `\B` if specific.non_word else `\b`)
  90. case ^Node_Match_All_And_Escape:
  91. io.write_string(w, "《.*$》")
  92. case nil:
  93. io.write_string(w, "<nil>")
  94. }
  95. }