【发布时间】:2015-08-25 03:27:26
【问题描述】:
我正在考虑制作一种有趣的自定义语言,主要是为了了解它是如何工作的,但是在我深入研究代码之前,我在概念方面遇到了一些麻烦。
我查看了 Kaleidoscope 示例代码和许多其他在线资源,但我对如何做一些事情感到困惑:
我的目标 将我的代码转换为 C++ 代码或直接转换为具有 C++ 风格 AST 的机器代码
原因 主要是为了学习,但如果我能把它做得足够好,我可能会进一步开发它。
我的语言是什么? 我的语言将专门针对 sql 和数据库创建,重点是版本控制和缓存策略。
我的问题 我不确定如何将我的“语言”中的一些信息翻译成 C++ 等价物。
示例:
//An Integer type which is nullable and the default value of null.
int number = nullable;
会翻译成这样的......
public static sqlInt number = new sqlInt(true, null);
我遇到的问题是,如何生成 AST 和 LLVM 代码生成以将“可为空”字段识别为新的 sqlInt 而无需明确写出?这需要适用于更复杂的类型:
示例 2:
//Create a foreign key which is of type int, points to pkID
//forces reference and holds ZeroToMany records for a single pkID
//It is also nullable with a default value of 0.
FK<int>(tableName.pkID, true, ZTM) fk1 = nullable(0);
会翻译成这样的:
public static FK<sqlInt> fk1 = new FK<sqlInt>(tableName.pkID, true,
ZTM, true, 0);
问题仍然存在,我是否必须构建特殊的 AST?如果是这样,我该怎么做才能做到这一点?或者这是否特定于 LLVM?
我似乎找不到类似这种风格的 llvm 语言示例。
到目前为止,我没有任何实际代码,我只是在收集信息,我似乎无法从我查看的代码中弄清楚这部分。
编辑 我(主要)了解如何制作解析器和词法分析器来查找函数并将其分配给变量,但我不确定何时应该派生函数来声明 sqlInt 以及如何找到正确的参数......等等。这是在 LLVM IR 之后的代码生成期间吗?我应该在 LLVM IR 之前考虑到这一点吗?
【问题讨论】:
标签: llvm code-generation abstract-syntax-tree