Location:
bionetgen/core/utils/utils.py:569 (list literal grammar)
bionetgen/core/utils/utils.py:585 (curly literal grammar)
Original markers:
# TODO: deal w/ zero argument list (line 569)
# TODO: handle 0 case (line 585)
The action-argument grammar uses pp.delimitedList(...), which requires at least one element. As a result, [] and {} literals don't parse:
arg_type_list = "[" + pp.delimitedList(quote_word ^ arg_type_float) + "]" — empty list fails
arg_type_curly = "{" + pp.delimitedList(curly_arg_token) + "}" — empty hash fails
What would unblock this: wrap each delimitedList call in pp.Optional(...):
arg_type_list = "[" + pp.Optional(pp.delimitedList(quote_word ^ arg_type_float)) + "]"
arg_type_curly = "{" + pp.Optional(pp.delimitedList(curly_arg_token)) + "}"
Add a regression test that round-trips an action with an empty literal arg.
Discovered during: non-Atomizer TODO/FIXME triage sweep, 2026-05-08.
Location:
bionetgen/core/utils/utils.py:569(list literal grammar)bionetgen/core/utils/utils.py:585(curly literal grammar)Original markers:
The action-argument grammar uses
pp.delimitedList(...), which requires at least one element. As a result,[]and{}literals don't parse:arg_type_list = "[" + pp.delimitedList(quote_word ^ arg_type_float) + "]"— empty list failsarg_type_curly = "{" + pp.delimitedList(curly_arg_token) + "}"— empty hash failsWhat would unblock this: wrap each
delimitedListcall inpp.Optional(...):Add a regression test that round-trips an action with an empty literal arg.
Discovered during: non-Atomizer TODO/FIXME triage sweep, 2026-05-08.