Have you considered using parser generators like antlr? They can let you maintain control for longer. Specification does not include logical NOT operator. DSLs are supposed to be simpler than GPLs and adjusted to the domain. You’ve made a C# dialect.