我正在研究制作一种有趣的自定义语言,主要是为了了解它是如何工作的,但在深入研究代码之前,我遇到了一些概念上的麻烦。
我查看了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之前解释这个吗?
答案 0 :(得分:1)
如果您正在使用LLVM,那么您将希望从您的语言转换为LLVM IR而不是c ++ ast。
从源语言文本到IR的过程是lexing,parsing,语义分析和降低。