我正在使用 Antlr4 创建一种语言,然后我想用它生成 LLVM IR。我是否需要手写 LLVM IR 来响应我的访问者事件?
I'm using Antlr4 to create a language which I then want to generate LLVM IR with. Do I need to hand-write LLVM IR in response to my visitor events?
在学习 Antlr4 时,我使用 Golang 作为目标语言,所以我的玩具语言中的语句如下:
$myVar = 10
$myVar + 5
将转换为生成结果“15”的一些 Golang 代码
但是,据我所知,ANTLR 没有 LLVM IR 目标,所以问题是:我有什么选择?
1) 生成 C/C++ 然后用它来发出 LLVM IR?
2) 尝试找到 Golang LLVM IR 发射器?
3) 继续使用生成的 Go lexer/parser 但手写 LLVM IR?
我试图浏览 LLVM 文档并观看了一些关于 LLVM 的视频<,但它们似乎都生成 C/C++,然后以这种方式与 API 通信。不确定他们这样做是因为那是他们所知道的,还是因为那是唯一的方法。
提前感谢您的任何见解!
While learning Antlr4, I used Golang as a target language, so a statement in my toy language like:
$myVar = 10
$myVar + 5
Would translate to some Golang code that generates "15" for the result
这不准确。你的语法被翻译成解析你的语言的 Go 代码。然后,您自己的代码可以使用生成的解析器将上述内容翻译成您想要的任何内容。
there isn't an LLVM IR target for ANTLR
即使有也帮不了你。所有要做的就是创建一个用 LLVM 而不是 Go 编写的解析器。您仍然需要自己编写代码将您的语言翻译成 LLVM(就像您必须编写自己的代码将您的语言翻译成 Go)。
至于是使用 LLVM-API 生成 LLVM 还是将其生成为字符串,任何一个选项都可以。有 Go bindings for LLVM,但也完全可以将 LLVM 程序集写入 .ll
文件,然后 运行 通过 llc
.
在学习 Antlr4 时,我使用 Golang 作为目标语言,所以我的玩具语言中的语句如下:
$myVar = 10
$myVar + 5
将转换为生成结果“15”的一些 Golang 代码
但是,据我所知,ANTLR 没有 LLVM IR 目标,所以问题是:我有什么选择?
1) 生成 C/C++ 然后用它来发出 LLVM IR?
2) 尝试找到 Golang LLVM IR 发射器?
3) 继续使用生成的 Go lexer/parser 但手写 LLVM IR?
我试图浏览 LLVM 文档并观看了一些关于 LLVM 的视频<,但它们似乎都生成 C/C++,然后以这种方式与 API 通信。不确定他们这样做是因为那是他们所知道的,还是因为那是唯一的方法。
提前感谢您的任何见解!
While learning Antlr4, I used Golang as a target language, so a statement in my toy language like:
$myVar = 10 $myVar + 5
Would translate to some Golang code that generates "15" for the result
这不准确。你的语法被翻译成解析你的语言的 Go 代码。然后,您自己的代码可以使用生成的解析器将上述内容翻译成您想要的任何内容。
there isn't an LLVM IR target for ANTLR
即使有也帮不了你。所有要做的就是创建一个用 LLVM 而不是 Go 编写的解析器。您仍然需要自己编写代码将您的语言翻译成 LLVM(就像您必须编写自己的代码将您的语言翻译成 Go)。
至于是使用 LLVM-API 生成 LLVM 还是将其生成为字符串,任何一个选项都可以。有 Go bindings for LLVM,但也完全可以将 LLVM 程序集写入 .ll
文件,然后 运行 通过 llc
.