aboutsummaryrefslogtreecommitdiff
path: root/spec/practical
diff options
context:
space:
mode:
Diffstat (limited to 'spec/practical')
-rw-r--r--spec/practical/not_xml_spec.cr37
1 files changed, 24 insertions, 13 deletions
diff --git a/spec/practical/not_xml_spec.cr b/spec/practical/not_xml_spec.cr
index f0b6911..c9db2a6 100644
--- a/spec/practical/not_xml_spec.cr
+++ b/spec/practical/not_xml_spec.cr
@@ -111,26 +111,37 @@ def close_element(name : String)
match_literal("</") >> match_literal(name) << match_literal(">")
end
-# TODO: implement Parser#and_then
-def parent_element
- Parser(Char, Element).new("parent element") do |tokens|
- result_open = open_element.parse(tokens)
- tokens = result_open.tokens
- base_element = result_open.value
- closing_name = base_element.name
-
- result_children = (element.many << close_element(closing_name)).parse(tokens)
- Result.new(
- result_children.tokens,
+def parent_element : Parser(Char, Element)
+ open_element.and_then do |base_element|
+ (element.many << close_element(base_element.name)).map do |elems|
Element.new(
base_element.name,
base_element.attributes,
- result_children.value
+ elems
)
- )
+ end.as(Parser(Char, Element))
end
end
+#def old_parent_element
+# Parser(Char, Element).new("parent element") do |tokens|
+# result_open = open_element.parse(tokens)
+# tokens = result_open.tokens
+# base_element = result_open.value
+# closing_name = base_element.name
+#
+# result_children = (element.many << close_element(closing_name)).parse(tokens)
+# Result.new(
+# result_children.tokens,
+# Element.new(
+# base_element.name,
+# base_element.attributes,
+# result_children.value
+# )
+# )
+# end
+#end
+
# Adapted from: https://bodil.lol/parser-combinators/
describe "markup language similar to XML" do