I replaced the rule: aux-pattern with these three patterns: ------- rule: { ?rule-op, ... } => { ?rule-op, ... } { ?rule-parser, ... } => { ?rule-parser, ... } { } => { } rule-op: { ?:name(?rule) } => { ?name(?rule) } rule-parser: { ?:name } => { "parse-" ## ?name } ------- This is slightly better. Now it recurses within the seq(...) calls, but I still get the following error: ------- Serious warning at tokenizers.dylan:9: Invalid syntax for rule-op in tokenizer-definer macro call. tokenizers.dylan:9: --------------- tokenizers.dylan:9: rule seq(choice(topic-directive, topic-title), opt(topic-content)) => tokens; tokenizers.dylan:9: --------------- Serious warning at tokenizers.dylan:8: Skipping tokenizer-definer macro call due to previous syntax error. tokenizers.dylan:8: ---------------------- tokenizers.dylan:8: define tokenizer topic tokenizers.dylan:9: rule seq(choice(topic-directive, topic-title), opt(topic-content)) => tokens; tokenizers.dylan:11: [...] tokenizers.dylan:12: end; tokenizers.dylan:13: --- ------- It looks like it tries to match "topic-directive" against rule-op, but if that fails, it doesn't try to match it against rule-parser:?