Grammar / own written parser?
It is worth coding the parser by hand if and only if you are very interested in making it extremely fast even on a very modest machine. For example, in this article on the history of Turbo Pascal before it got its name, you can see how and why the prototype impressed the small (then Danish) firm Borland to hire the prototype author (Anders Hejlsberg), in full develop a compiler and run it as main product and I am quoting ...:
without much expectation I hit the compile key - AND THEN I WAS FULLY FULLY! My test program, it took a few minutes to compile and link using Pascal MT + digital research, was compiled and run before I could even blink! It was a wonderful WOW moment!
Turbo Pascal's superb compilation speed - primarily from a carefully crafted and highly tuned recursive descent parser, coded in assembly language - allowed it to use a very different strategy from most compilers: no separate object generating compilation passes files and libraries, and then the linker to combine them, and Turbo Pascal 1.0 was a one-pass compiler that turned the source code directly into a single executable binary.
I remember the same amazing experience on tiny personal computers of that era (when Z80, 64K or RAM and two floppy disks were a lot ;-) - Turbo Pascal, with its amazing parser and IDE and everything else, fits comfortably into memory along with a significant program like in both native and compiled form - no floppies are required, which means many orders of magnitude difference in program execution time.
If Hejlsberg had stuck with what was traditional wisdom at the time - always use parser generators - Turbo Pascal would probably never have emerged as a commercial product and definitely would not have achieved the dominance of the Pascal world he has enjoyed for years.
Of course, on a typical PC today, this extreme parsing speed will not be needed by most compilers. Possible exceptions include compilers that should run seamlessly as part of an interpreter-like environment (simple compilers for languages ββlike Perl and Python are usually hand-coded, in large part, for this reason it is an implementation choice that made them viable in 90s, although today he has not yet realized that he is still needed) or compilers running on very limited hardware resources such as smartphones or inexpensive netbooks.
In the vast majority of cases where you will be writing a compiler, none of these performance considerations are likely to apply, and you will be happier with a parser generator.
a source to share
There is no hard answer other than "use whatever is easiest for a given situation."
My experience is that parsers get more complex over the course of their life, so using a parser generator in the front usually pays off. Even if the language doesn't get complicated, using a generator forces you to create a formal syntax specification, which is valuable in itself.
The disadvantages are that other programmers may not know how to use the generator, so it makes it difficult for others to help, and it makes your project depend on that generator.
a source to share
Your question title suggests that the use of grammar is optional. This is really not the case - even if I am going to implement a tiny language, I will draw the grammar on one sheet of paper.
As for when to use parser generators, this is really personal preference. Many people believe in manual recursive descent guerrillas instead of using a table based approach, for example. It is important to understand how convenient it is to work with the generator.
And don't think that using parser generators is any more professional or even simpler approach. Bjarne Stroustrup wrote the first C ++ compiler designed to use recursive descent, but this has been talked about by some fierce colleagues at Bell Labs, much to his chagrin. See Section 3.3.2, C ++ Design and Evolution for details.