It is generally a good idea to keep source files small and containing related routines. Generally I use one file for each object class. If that file gets too big I then split off related methods into their own files.
In my Hack Assembler, I have main(), pass1() and pass2() in the same source file because they are all fairly short functions.
If the Assembler had to handle multiple source files or all files in a directory I would have had separate main and assemble sources. (My VM Translator and Jack Compiler are structured with a separate main source and translate/compile sources.)