Я использую Antlr4 для создания языка, с помощью которого я затем хочу сгенерировать LLVM IR. Нужно ли мне писать от руки LLVM IR в ответ на события моего посетителя? - PullRequest
0 голосов
/ 05 мая 2019

Изучая Antlr4, я использовал Golang в качестве целевого языка, поэтому утверждение на моем игрушечном языке, например:

$myVar = 10
$myVar + 5

Будет преобразован в некоторый код Голанга, который генерирует "15" для результата

Однако, насколько я вижу, для ANTLR нет цели IR LLVM, поэтому вопрос: какие у меня варианты?

1) Создать C / C ++, а затем использовать его для излучения LLVM IR?
2) Попробуйте найти ИК-излучатель Golang LLVM?
3) Продолжать использовать сгенерированный лексер / парсер Go, но писать вручную LLVM IR?

Я попытался просмотреть документацию по LLVM и посмотрел несколько видео на LLVM <, но все они, похоже, генерируют C / C ++, а затем общаются с API таким образом. Не уверен, что они это делают, потому что это то, что они знают, или потому, что это единственный способ. </p>

Заранее спасибо за любые идеи!

1 Ответ

0 голосов
/ 05 мая 2019

Во время изучения Antlr4 я использовал Golang в качестве целевого языка, поэтому утверждение на моем игрушечном языке, например:

$myVar = 10
$myVar + 5

будет переводиться в некоторый код Golang, который генерирует «15» для результата

Это не точно.Ваша грамматика переводится в код Go, который анализирует ваш язык.Ваш собственный код может затем использовать этот сгенерированный синтаксический анализатор, чтобы перевести вышеприведенное во что угодно.

нет цели LLVM IR для ANTLR

И это не поможетВы, если бы был один.Все, что нужно сделать, это создать парсер, написанный на LLVM вместо Go.Вам все равно придется написать код, чтобы перевести свой язык на LLVM самостоятельно (точно так же, как вам нужно было бы написать собственный код для перевода вашего языка на Go).


Относительно того, следует ли использоватьLLVM-API для генерации LLVM или для генерации его в виде строк, любой вариант будет работать.Есть привязки Go для LLVM , но также вполне возможно просто записать сборку LLVM в файл .ll и затем запустить ее через llc.

...