} else {
// In this, we have a term which is specified to
// have an argument, but for which no argument is
// given. In which case, we simply expand the term
// to include its default argument type.
Automaton macro_automaton = macro.automaton();
int root = Automata.extract(macro_automaton, macro_automaton.getRoot(0), states);
// We store the location of the expanded macro into the
// roots cache so that it can be reused if/when we
// encounter the same macro again.
roots.put(name, root);
visited.put(node, root);
return expand(root, states, visited, roots, macros);
}
} else if (macro != null && !(macro instanceof Type.Term)) {
// In this case, we have identified a nominal type which
// should be inlined into this automaton and then
// recursively expanded as necessary.
Automaton macro_automaton = macro.automaton();
int element = Automata.extract(macro_automaton, macro_automaton.getRoot(0), states);
int base = states.size();
states.add(new Automaton.Strung(name));
states.add(new Automaton.List(base, element));
states.add(new Automaton.Term(K_Nominal,
base+1));