There's often a structural aspect that is constant even though the details change. Language grammars undergo numerous small but important changes during compiler development.
Resolution Make the program be table-driven.
Define the parts that change and put them in a table. Write a small routine that uses the table to know what to do. The table may be static, or linked in at runtime, or read from a file or network, etc. It's often beneficial if it is separate from the interpreting routine, so you can change the table without affecting the code. The grammar is stored in the table.