1. Поверьте человеку, который пишет на Си с 1985 года (30 лет, вроде бы?) - НИКОГДА не пишите на Си ничего, если только к вашему виску не приставили пистолет. Исключение одно - ядро ОС. Да и то...
2. Что угодно можно написать на чём угодно. Вопрос удобства.
3. Писать компилятор надо на языке с развитыми средствами поддержки жизни проекта. Таких два - Java и C#. Можно (а если Вам это комфортно, то и нужно) использовать функциональные расширения соответствующих платформ. Scala/F#.
4. На говноязыках серьёзные вещи писать не нужно. Ключевое свойство говноязыка - обсуждение вокруг него о том, как бедные программеры перетрудились явно прописывать руками типы всех переменных. На таких ЯП можно писать затычки и примочки.
5. Не применяйте генераторы лексических и грамматических анализаторов, пока не научитесь писать компилятор руками. Ключевое слово - парсинг рекурсивным спуском. Это реально просто, если грамматика языка - LR1. Для начала надо взять простой язык. Очень простой.
6. Базовый компилятор с кодогенерацией для стековой машины нужно уметь писать за два дня. Если вы хотите это уметь.
7. Бекэнды (реальную кодогенерацию) писать НЕ НУЖНО. Вообще. Вы её хорошо не напишете ни-ко-гда. Проще генерировать на выходе Си и докомпилировать приличным си-компилятором.