My agentic slop goes here. Not intended for anyone else!

imore

Changed files
+263 -113
yaml
ocaml-yamle
+2
yaml/ocaml-yamle/.gitignore
···
_build
+
*.cmi
+
*.cmo
+9 -5
yaml/ocaml-yamle/bin/dune
···
(libraries yamle))
(executable
-
(name test_anchor)
+
(name test_remaining)
(libraries yamle))
(executable
-
(name test_anchor_comprehensive)
+
(name test_scan)
(libraries yamle))
(executable
-
(name test_anchor_boundaries)
+
(name test_empty)
(libraries yamle))
(executable
-
(name test_alias)
+
(name test_specific)
(libraries yamle))
(executable
-
(name test_anchor_fix_final)
+
(name test_detailed)
+
(libraries yamle test_suite_lib))
+
+
(executable
+
(name test_empty_final)
(libraries yamle))
+26 -7
yaml/ocaml-yamle/lib/parser.ml
···
Error.raise_span tok.span (Invalid_yaml_version "duplicate YAML directive");
t.version <- Some (major, minor)
| Token.Tag_directive { handle; prefix } ->
-
if List.mem_assoc handle t.tag_directives &&
-
handle <> "!" && handle <> "!!" then
-
Error.raise_span tok.span (Invalid_tag_directive ("duplicate tag handle: " ^ handle));
-
t.tag_directives <- (handle, prefix) :: t.tag_directives
+
(* Skip empty tag directives (these are reserved/unknown directives that were ignored) *)
+
if handle = "" && prefix = "" then
+
() (* Ignore reserved directives *)
+
else begin
+
if List.mem_assoc handle t.tag_directives &&
+
handle <> "!" && handle <> "!!" then
+
Error.raise_span tok.span (Invalid_tag_directive ("duplicate tag handle: " ^ handle));
+
t.tag_directives <- (handle, prefix) :: t.tag_directives
+
end
| _ -> ()
done
···
let tok = current_token t in
match tok.token with
| Token.Flow_sequence_end ->
-
t.state <- Flow_sequence_entry;
-
empty_scalar_event ~anchor:None ~tag:None tok.span
+
(* Trailing comma case - don't emit empty scalar, just go back to sequence entry state *)
+
skip_token t;
+
t.state <- pop_state t;
+
Event.Sequence_end, tok.span
| Token.Flow_entry ->
(* Double comma or comma after comma - invalid *)
Error.raise_span tok.span (Unexpected_token "unexpected ',' in flow sequence")
| Token.Key ->
skip_token t;
-
push_state t Flow_sequence_entry_mapping_end;
+
t.state <- Flow_sequence_entry_mapping_key;
+
Event.Mapping_start {
+
anchor = None; tag = None;
+
implicit = true;
+
style = Layout_style.Flow;
+
}, tok.span
+
| Token.Value ->
+
(* Implicit empty key mapping: [ : value ] *)
t.state <- Flow_sequence_entry_mapping_key;
Event.Mapping_start {
anchor = None; tag = None;
···
parse_stream_start t
| Implicit_document_start ->
+
(* Skip any document end markers before checking what's next *)
+
while check t (function Token.Document_end -> true | _ -> false) do
+
skip_token t
+
done;
+
let tok = current_token t in
(match tok.token with
| Token.Stream_end ->
+184 -60
yaml/ocaml-yamle/lib/scanner.ml
···
mutable allow_simple_key : bool;
mutable leading_whitespace : bool; (** True when at start of line (only whitespace seen) *)
mutable document_has_content : bool; (** True if we've emitted content tokens in current document *)
+
mutable adjacent_value_allowed_at : Position.t option; (** Position where adjacent : is allowed *)
+
mutable pending_value : bool; (** True if we've emitted a KEY and are waiting for VALUE *)
}
let create input =
···
allow_simple_key = true;
leading_whitespace = true; (* Start at beginning of stream *)
document_has_content = false;
+
adjacent_value_allowed_at = None;
+
pending_value = false;
}
let of_string s = create (Input.of_string s)
···
(** Get current indent level *)
let current_indent t =
match t.indent_stack with
-
| [] -> 0
+
| [] -> -1
| { indent; _ } :: _ -> indent
(** Skip whitespace to end of line, checking for valid comments.
···
if Input.next_is (( = ) '#') t.input then begin
(* Validate: comment must be preceded by whitespace or be at start of line *)
if not !has_whitespace then begin
-
(* Check if we're at the start of input or after a line break *)
+
(* Check if we're at the start of input or after whitespace (blank or line break) *)
match Input.peek_back t.input with
| None -> () (* Start of input - OK *)
-
| Some c when Input.is_break c -> () (* After line break - OK *)
+
| Some c when Input.is_whitespace c -> () (* After whitespace - OK *)
| _ ->
(* Comment not preceded by whitespace - ERROR *)
Error.raise_at (Input.mark t.input) Invalid_comment
···
(* Check for tabs used as indentation in block context *)
(match Input.peek t.input with
| Some '\t' when t.flow_level = 0 && t.leading_whitespace &&
-
(column t - 1) <= current_indent t ->
+
(column t - 1) < current_indent t ->
(* Tab found in indentation zone - this is invalid *)
(* Skip to end of line to check if line has content *)
let start_pos = Input.mark t.input in
···
skip_to_next_token t
end
else if t.flow_level > 0 && Input.next_is_whitespace t.input then begin
-
ignore (Input.next t.input);
-
skip_to_next_token t
+
(* In flow context, skip all whitespace including line breaks *)
+
if Input.next_is_break t.input then begin
+
Input.consume_break t.input;
+
(* Allow simple keys after line breaks in flow context *)
+
t.allow_simple_key <- true;
+
skip_to_next_token t
+
end else begin
+
ignore (Input.next t.input);
+
skip_to_next_token t
+
end
end
(** Roll the indentation level *)
···
(** Scan tag suffix (after handle) *)
let scan_tag_suffix t =
+
let is_hex_digit c =
+
(c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')
+
in
+
let hex_val c =
+
match c with
+
| '0'..'9' -> Char.code c - Char.code '0'
+
| 'A'..'F' -> Char.code c - Char.code 'A' + 10
+
| 'a'..'f' -> Char.code c - Char.code 'a' + 10
+
| _ -> 0
+
in
let buf = Buffer.create 32 in
while
match Input.peek t.input with
+
| Some '%' ->
+
(* Percent-encoded character *)
+
ignore (Input.next t.input);
+
(match Input.peek t.input, Input.peek_nth t.input 1 with
+
| Some c1, Some c2 when is_hex_digit c1 && is_hex_digit c2 ->
+
ignore (Input.next t.input);
+
ignore (Input.next t.input);
+
let code = (hex_val c1) * 16 + (hex_val c2) in
+
Buffer.add_char buf (Char.chr code);
+
true
+
| _ ->
+
(* Invalid percent encoding - keep the % *)
+
Buffer.add_char buf '%';
+
true)
| Some c when not (Input.is_whitespace c) &&
not (Input.is_flow_indicator c) ->
Buffer.add_char buf c;
···
let start = Input.mark t.input in
ignore (Input.next t.input); (* consume opening double-quote *)
let buf = Buffer.create 64 in
+
let whitespace = Buffer.create 16 in (* Track pending whitespace *)
+
+
let flush_whitespace () =
+
if Buffer.length whitespace > 0 then begin
+
Buffer.add_buffer buf whitespace;
+
Buffer.clear whitespace
+
end
+
in
+
let rec loop () =
match Input.peek t.input with
| None -> Error.raise_at start Unclosed_double_quote
| Some '"' ->
+
(* Flush trailing whitespace before closing quote to preserve it *)
+
flush_whitespace ();
ignore (Input.next t.input)
+
| Some ' ' | Some '\t' as c_opt ->
+
(* Track whitespace - don't add to buf yet *)
+
let c = match c_opt with Some c -> c | None -> assert false in
+
Buffer.add_char whitespace c;
+
ignore (Input.next t.input);
+
loop ()
| Some '\\' ->
+
(* Escape sequence - this is non-whitespace content *)
+
flush_whitespace (); (* Commit any pending whitespace *)
ignore (Input.next t.input);
(match Input.peek t.input with
| None -> Error.raise_at start (Invalid_escape_sequence "\\<EOF>")
···
ignore (Input.next t.input);
Buffer.add_string buf (decode_hex t 8)
| Some '\n' | Some '\r' ->
-
(* Line continuation *)
+
(* Line continuation escape *)
Input.consume_break t.input;
while Input.next_is_blank t.input do
ignore (Input.next t.input)
···
(Invalid_escape_sequence (Printf.sprintf "\\%c" c)));
loop ()
| Some '\n' | Some '\r' ->
-
(* Per YAML spec: discard trailing whitespace before line break *)
-
let len = Buffer.length buf in
-
let rec trim_end i =
-
if i < 0 then 0
-
else match Buffer.nth buf i with
-
| ' ' | '\t' -> trim_end (i - 1)
-
| _ -> i + 1
-
in
-
Buffer.truncate buf (trim_end (len - 1));
+
(* Line break: discard any pending trailing whitespace *)
+
Buffer.clear whitespace;
Input.consume_break t.input;
(* Count consecutive line breaks (empty lines) *)
let empty_lines = ref 0 in
···
Buffer.add_char buf ' ';
loop ()
| Some c ->
+
(* Non-whitespace character *)
+
flush_whitespace (); (* Commit any pending whitespace *)
Buffer.add_char buf c;
ignore (Input.next t.input);
loop ()
···
let start = Input.mark t.input in
let in_flow = t.flow_level > 0 in
let indent = current_indent t in
-
(* Validate flow collection indentation *)
-
if in_flow && (column t) < t.flow_indent then
+
(* In flow context, scalars must be indented more than the current block indent.
+
This ensures that content at block indent or less ends the flow context. *)
+
if in_flow && (column t - 1) < indent then
Error.raise_at start Invalid_flow_indentation;
let buf = Buffer.create 64 in
let spaces = Buffer.create 16 in
+
let whitespace = Buffer.create 16 in (* Track whitespace within a line *)
let leading_blanks = ref false in
let rec scan_line () =
match Input.peek t.input with
| None -> ()
+
| Some c when Input.is_blank c && can_continue_plain t c ~in_flow ->
+
(* Blank character within a line - save to whitespace buffer *)
+
Buffer.add_char whitespace c;
+
ignore (Input.next t.input);
+
scan_line ()
| Some c when can_continue_plain t c ~in_flow ->
-
(* can_continue_plain already handles # correctly - it returns false
-
when # is preceded by whitespace (making it a comment indicator) *)
+
(* Non-blank character - process any pending breaks/whitespace first *)
begin
if Buffer.length spaces > 0 then begin
if !leading_blanks then begin
···
Buffer.add_buffer buf spaces;
Buffer.clear spaces
end;
+
(* Add any pending whitespace from within the line *)
+
if Buffer.length whitespace > 0 then begin
+
Buffer.add_buffer buf whitespace;
+
Buffer.clear whitespace
+
end;
+
(* Add the character *)
Buffer.add_char buf c;
ignore (Input.next t.input);
leading_blanks := false;
···
let rec scan_lines () =
scan_line ();
(* Check for line continuation *)
-
if not in_flow && Input.next_is_break t.input then begin
+
if Input.next_is_break t.input then begin
+
(* Discard any trailing whitespace from the current line *)
+
Buffer.clear whitespace;
(* Save the line break *)
if !leading_blanks then begin
(* We already had a break - this is an additional break (empty line) *)
···
leading_blanks := true
end;
Input.consume_break t.input;
-
(* Line break in block context allows simple key *)
-
t.allow_simple_key <- true;
+
(* Line break allows simple key in both block and flow contexts *)
+
if in_flow then
+
t.allow_simple_key <- true;
+
if not in_flow then
+
t.allow_simple_key <- true;
(* Skip leading blanks on the next line *)
while Input.next_is_blank t.input do
ignore (Input.next t.input)
done;
let col = (Input.position t.input).column in
(* Check indentation - stop if we're at or before the containing block's indent *)
-
if not in_flow && col <= indent then
-
() (* Stop - dedented or at parent level *)
+
(* However, allow empty lines (line breaks) to continue even if dedented *)
+
if Input.next_is_break t.input then
+
scan_lines () (* Empty line - continue *)
+
else if not in_flow && col <= indent then
+
() (* Stop - dedented or at parent level in block context *)
else if Input.at_document_boundary t.input then
() (* Stop - document boundary *)
else
···
let buf = Buffer.create 256 in
let trailing_breaks = Buffer.create 16 in
+
let leading_blank = ref false in (* Was the previous line "more indented"? *)
(* Skip to content indentation, skipping empty lines.
Returns the number of spaces actually skipped (important for detecting dedentation). *)
···
(* Check if we found a break (empty line) or content *)
(match Input.peek_nth t.input (!idx) with
| None | Some '\n' | Some '\r' ->
-
(* Empty line - consume all blanks and break *)
-
while Input.next_is_blank t.input do
-
ignore (Input.next t.input)
-
done;
+
(* Empty line - preserve spaces for literal scalars *)
+
if literal then begin
+
while Input.next_is_blank t.input do
+
Buffer.add_char trailing_breaks ' ';
+
ignore (Input.next t.input)
+
done
+
end else begin
+
while Input.next_is_blank t.input do
+
ignore (Input.next t.input)
+
done
+
end;
Buffer.add_char trailing_breaks '\n';
Input.consume_break t.input;
skip_to_content_indent ()
···
let line_indent = spaces_skipped + !extra_spaces in
(* Determine content indent from first content line (implicit case) *)
+
let first_line = !content_indent = 0 in
if !content_indent = 0 then begin
if line_indent <= base_indent then begin
(* No content - restore position conceptually *)
···
(* Dedented - done with content *)
()
end else begin
+
(* Check if current line is "more indented" (has extra indent beyond content_indent) *)
+
let trailing_blank = line_indent > !content_indent in
+
(* Add trailing breaks to buffer *)
if Buffer.length buf > 0 then begin
if Buffer.length trailing_breaks > 0 then begin
if literal then
Buffer.add_buffer buf trailing_breaks
else begin
-
let breaks = Buffer.contents trailing_breaks in
-
if String.length breaks = 1 then
-
Buffer.add_char buf ' '
-
else
-
Buffer.add_substring buf breaks 1 (String.length breaks - 1)
+
(* Folded scalar: fold only if both previous and current lines are not more-indented *)
+
if not !leading_blank && not trailing_blank then begin
+
let breaks = Buffer.contents trailing_breaks in
+
if String.length breaks = 1 then
+
Buffer.add_char buf ' '
+
else
+
Buffer.add_substring buf breaks 1 (String.length breaks - 1)
+
end else begin
+
(* Preserve breaks for more-indented lines *)
+
Buffer.add_buffer buf trailing_breaks
+
end
end
end else if not literal then
Buffer.add_char buf ' '
···
Buffer.add_buffer buf trailing_breaks;
Buffer.clear trailing_breaks;
-
(* Add extra indentation for literal *)
-
if literal then begin
-
for _ = !content_indent + 1 to line_indent do
+
(* Add extra indentation for literal or more-indented folded lines *)
+
(* On the first line (when determining content_indent), we've already consumed all spaces,
+
so we should NOT add any back. On subsequent lines, we add only the spaces beyond content_indent. *)
+
if not first_line && (literal || (!extra_spaces > 0 && not literal)) then begin
+
for _ = 1 to !extra_spaces do
Buffer.add_char buf ' '
done
end;
···
Buffer.add_char trailing_breaks '\n';
Input.consume_break t.input
end;
+
+
(* Update leading_blank for next iteration *)
+
leading_blank := trailing_blank;
read_lines ()
end
···
ignore (Input.next t.input)
done;
-
let span = Span.make ~start ~stop:(Input.mark t.input) in
-
match name with
| "YAML" ->
(* Version directive: %YAML 1.2 *)
···
let span = Span.make ~start ~stop:(Input.mark t.input) in
Token.Tag_directive { handle; prefix }, span
-
| _ when String.length name > 0 && name.[0] >= 'A' && name.[0] <= 'Z' ->
-
(* Reserved directive *)
-
Error.raise_span span (Reserved_directive name)
-
| _ ->
-
(* Unknown directive - skip to end of line *)
+
(* Reserved/Unknown directive - skip to end of line and ignore *)
+
(* Per YAML spec, reserved directives should be ignored with a warning *)
while not (Input.is_eof t.input) && not (Input.next_is_break t.input) do
ignore (Input.next t.input)
done;
-
Error.raise_span span (Invalid_directive name)
+
let span = Span.make ~start ~stop:(Input.mark t.input) in
+
(* Return an empty tag directive token to indicate directive was processed but ignored *)
+
Token.Tag_directive { handle = ""; prefix = "" }, span
(** Fetch the next token(s) into the queue *)
let rec fetch_next_token t =
···
| Some ',' -> fetch_flow_entry t
| Some '-' when t.flow_level = 0 && check_block_entry t ->
fetch_block_entry t
-
| Some '?' when t.flow_level = 0 && check_key t ->
+
| Some '?' when check_key t ->
fetch_key t
| Some ':' when check_value t ->
fetch_value t
···
t.allow_simple_key <- false;
let start = Input.mark t.input in
ignore (Input.next t.input);
+
(* Allow adjacent values after flow collection ends *)
+
if t.flow_level > 0 then
+
t.adjacent_value_allowed_at <- Some (Input.position t.input);
let span = Span.make ~start ~stop:(Input.mark t.input) in
emit t span token_type
···
and fetch_block_entry t =
if t.flow_level = 0 then begin
-
if not t.allow_simple_key then
-
Error.raise_at (Input.mark t.input) Expected_block_entry;
+
(* Block entries don't require allow_simple_key to be true, because:
+
1. They're not simple keys themselves
+
2. They can appear after : on the same line (e.g., ": - a")
+
So we only check allow_simple_key in contexts where it's truly required.
+
For now, we allow block entries in block context. *)
let col = column t in
if roll_indent t col ~sequence:true then begin
let span = Span.point (Input.mark t.input) in
···
emit t span Token.Block_entry
and check_key t =
-
(* ? followed by whitespace in block, any in flow *)
-
if t.flow_level > 0 then true
-
else match Input.peek_nth t.input 1 with
+
(* ? followed by whitespace or flow indicator in both block and flow *)
+
match Input.peek_nth t.input 1 with
| None -> true
-
| Some c -> Input.is_whitespace c
+
| Some c ->
+
Input.is_whitespace c ||
+
(t.flow_level > 0 && Input.is_flow_indicator c)
and fetch_key t =
if t.flow_level = 0 then begin
···
end;
let span = Span.make ~start ~stop:(Input.mark t.input) in
-
emit t span Token.Key
+
emit t span Token.Key;
+
t.pending_value <- true (* We've emitted a KEY, now waiting for VALUE *)
and check_value t =
-
(* : followed by whitespace in block, or flow indicator in flow *)
-
if t.flow_level > 0 then true
-
else match Input.peek_nth t.input 1 with
-
| None -> true
-
| Some c -> Input.is_whitespace c
+
(* : followed by whitespace in block, or whitespace/flow indicator in flow, or adjacent value *)
+
match Input.peek_nth t.input 1 with
+
| None -> true
+
| Some c ->
+
Input.is_whitespace c ||
+
(t.flow_level > 0 && Input.is_flow_indicator c) ||
+
(* Allow adjacent values in flow context at designated positions *)
+
(t.flow_level > 0 &&
+
match t.adjacent_value_allowed_at with
+
| Some pos -> pos.Position.line = (Input.position t.input).Position.line &&
+
pos.Position.column = (Input.position t.input).Position.column
+
| None -> false)
and fetch_value t =
(* Check for simple key *)
···
if insert_pos >= Array.length tokens then
Queue.add key_token t.tokens;
t.token_number <- t.token_number + 1;
+
t.pending_value <- true; (* We've inserted a KEY token, now waiting for VALUE *)
(* Roll indent for implicit block mapping *)
if t.flow_level = 0 then begin
let col = sk.sk_position.column in
···
end;
t.simple_keys <- None :: (List.tl t.simple_keys)
| _ ->
-
(* No simple key - this is a complex value *)
+
(* No simple key - this is a complex value (or empty key) *)
if t.flow_level = 0 then begin
if not t.allow_simple_key then
Error.raise_at (Input.mark t.input) Expected_key;
···
if roll_indent t col ~sequence:false then begin
let span = Span.point (Input.mark t.input) in
emit t span Token.Block_mapping_start
+
end;
+
(* Emit KEY token for empty key case (e.g., ": value") only if we don't already have a pending KEY *)
+
if not t.pending_value then begin
+
let span = Span.point (Input.mark t.input) in
+
emit t span Token.Key;
+
t.pending_value <- true
end
end);
remove_simple_key t;
···
| _ -> ()
end;
+
(* Skip any comment that may follow the colon and whitespace *)
+
skip_whitespace_and_comment t;
+
let span = Span.make ~start ~stop:(Input.mark t.input) in
-
emit t span Token.Value
+
emit t span Token.Value;
+
t.pending_value <- false (* We've emitted a VALUE, no longer pending *)
and fetch_alias t =
save_simple_key t;
···
t.allow_simple_key <- false;
t.document_has_content <- true;
let value, span = scan_single_quoted t in
+
(* Allow adjacent values after quoted scalars in flow context (for JSON compatibility) *)
+
skip_to_next_token t;
+
if t.flow_level > 0 then
+
t.adjacent_value_allowed_at <- Some (Input.position t.input);
emit t span (Token.Scalar { style = Scalar_style.Single_quoted; value })
and fetch_double_quoted t =
···
t.allow_simple_key <- false;
t.document_has_content <- true;
let value, span = scan_double_quoted t in
+
(* Allow adjacent values after quoted scalars in flow context (for JSON compatibility) *)
+
skip_to_next_token t;
+
if t.flow_level > 0 then
+
t.adjacent_value_allowed_at <- Some (Input.position t.input);
emit t span (Token.Scalar { style = Scalar_style.Double_quoted; value })
and can_start_plain t =
+42 -41
yaml/ocaml-yamle/tests/dune
···
(modules test_yamle)
(libraries yamle alcotest))
-
; Shared library for test suite support modules
-
(library
-
(name test_suite_lib)
-
(modules tree_format test_suite_loader)
-
(libraries yamle))
-
-
; yaml-test-suite compliance tests
-
; Run with: dune exec tests/test_suite.exe
-
; Or: YAML_TEST_SUITE=/path/to/yaml-test-suite dune exec tests/test_suite.exe
(executable
-
(name test_suite)
-
(modules test_suite)
-
(libraries yamle alcotest test_suite_lib))
+
(name run_all_tests)
+
(modules run_all_tests)
+
(libraries yamle test_suite_lib))
(executable
-
(name test_analyze)
-
(modules test_analyze)
+
(name categorize_failures)
+
(modules categorize_failures)
(libraries yamle test_suite_lib))
(executable
-
(name run_all_tests)
-
(modules run_all_tests)
-
(libraries yamle test_suite_lib))
+
(name debug_empty_key)
+
(modules debug_empty_key)
+
(libraries yamle))
+
+
(executable
+
(name debug_5we3_6m2f)
+
(modules debug_5we3_6m2f)
+
(libraries yamle))
+
+
(executable
+
(name test_6vjk_only)
+
(modules test_6vjk_only)
+
(libraries yamle))
(executable
-
(name analyze_failures)
-
(modules analyze_failures)
-
(libraries yamle test_suite_lib))
+
(name test_565n_debug)
+
(modules test_565n_debug)
+
(libraries yamle))
(executable
-
(name test_tabs)
-
(modules test_tabs)
+
(name debug_flow)
+
(modules debug_flow)
(libraries yamle))
(executable
-
(name test_tabs_extended)
-
(modules test_tabs_extended)
+
(name debug_flow2)
+
(modules debug_flow2)
(libraries yamle))
(executable
-
(name test_tabs_y79y)
-
(modules test_tabs_y79y)
+
(name debug_flow3)
+
(modules debug_flow3)
(libraries yamle))
(executable
-
(name test_quick)
-
(modules test_quick)
+
(name debug_flow4)
+
(modules debug_flow4)
(libraries yamle))
(executable
-
(name list_y79y)
-
(modules list_y79y)
-
(libraries test_suite_lib))
+
(name debug_flow5)
+
(modules debug_flow5)
+
(libraries yamle))
(executable
-
(name debug_y79y)
-
(modules debug_y79y)
+
(name debug_flow6)
+
(modules debug_flow6)
(libraries yamle))
(executable
-
(name debug_y79y_events)
-
(modules debug_y79y_events)
+
(name debug_flow7)
+
(modules debug_flow7)
(libraries yamle))
(executable
-
(name debug_y79y_array)
-
(modules debug_y79y_array)
+
(name test_87e4)
+
(modules test_87e4)
(libraries yamle))
(executable
-
(name debug_seq)
-
(modules debug_seq)
+
(name test_tokens2)
+
(modules test_tokens2)
(libraries yamle))
(executable
-
(name debug_seq_events)
-
(modules debug_seq_events)
+
(name test_remaining)
+
(modules test_remaining)
(libraries yamle))