private void generateBody(
      ScriptOutputImpl sourceCode, List<TokenImpl> tokens, CompileCallback callbacks) {
    for (int i = 0; i < tokens.size(); i++) {
      TokenImpl token = tokens.get(i);
      TokenImpl previousToken = null;
      if (i > 0) previousToken = tokens.get(i - 1);

      TemplateToken state = token.state;

      switch (state) {
        case EOF:
          return;
        case PLAIN:
          creator.printPlain(token, sourceCode);
          break;
        case SCRIPT:
          creator.printScript(token, sourceCode);
          break;
        case EXPR:
          creator.printExpression(token, sourceCode);
          break;
        case MESSAGE:
          creator.printMessage(token, sourceCode);
          break;
        case ACTION:
          creator.printAction(false);
          break;
        case ABSOLUTE_ACTION:
          creator.printAction(true);
          break;
        case COMMENT:
          creator.unprintUpToLastNewLine();
          break;
        case START_END_TAG:
          creator.printStartEndTag(token, sourceCode, callbacks);
          break;
        case START_TAG:
          creator.printStartTag(token, previousToken, sourceCode, callbacks);
          break;
        case END_TAG:
          creator.printEndTag(token, sourceCode);
          break;
      }
    }
  }