svoid tok_stages(LS tok) {
  // anonymous stage (name = shortened source code)

  replaceKeywordBlock(tok, "stage", "{ stage(r {", "}); }");
  
  // named stage
  
  replaceKeywordPlusQuotedBlock_dyn(tok, "stage", (_tok, iKeyword)
    -> stringArray("{ stage(" + tok.get(iKeyword+2) + ", r {", "}); }"));
    
  // stage with name and variable
  for (iStage : rjfindAll(tok, "stage <id> <quoted>")) {
    S id = tok.get(iStage+2);
    S name = tok.get(iStage+4);
    int iOpening = iStage+6;
    assertEquals("{", tok.get(iOpening));
    int iClosing = tok_findEndOfBlock(tok, iOpening)-1;
    tokSet_reTok(tok, iClosing, "});");
    replaceTokens_reTok(tok, iStage, iOpening,
      "Stage \*id*/ = stage(" + name + ", r ");
  }
}