Чтобы испускать сырой IL, вам нужно определить свой собственный AST. Вам нужно получить AssemblyBuilder, затем ModuleBuilder, а затем вы можете определить метод уровня модуля или получить новый TypeBuilder и теперь MethodBuilder для определения метода уровня класса.
Вы сказали, что у вас уже есть лексер и парсер. это означает, что вы можете построить АСТ. Так что просто пройдитесь по разобранным выражениям и испустите свой IL.
Даже если вы получите сгенерированный (путем компиляции) код, вы не сможете с ним что-то сделать полезного, поскольку сгенерированный код зависит от инфраструктуры. Например, если вам нужно скомпилировать замыкания, вы должны создать класс или другое хранилище для лексических переменных и т. Д. (Например, не лексическая передача управления, которая требует использования исключений в .net)