###Installation
Kaleidoscope++基于LLVM, 在Linux上,如果安装了llvm(3.6+)和clang(3.6+),可以直接编译
clang++ -g Kaleidoscope.cpp `llvm-config --cxxflags --ldflags --system-libs --libs core mcjit native` -O3 -o toy
如果使用VC2013编译的LLVM,需要进行以下设置
-
需要使用llvm提供的cl.exe进行编译
-
包含目录和库目录中需要引入llvm的库目录和头文件目录
-
clang不支持异常,需增加预处理定义_HAS_EXCEPTIONS=0
-
代码生成的运行库需要修改为多线程DLL
-
链接器的依赖项中增加llvm的lib文件
-
不同的目的机器类型设定Module文件的targettriple属性
###Kaleidoscope++的范式:
-
top范式表示所有输入
top ::= definition | external | expression | ';'
-
toplevelexpr范式
toplevelexpr ::= expression
-
expression范式
expression ::= unary binoprhs
-
unary范式, 首先判断当前的cur_tok是否为unary operator
unary ::= primary ::= op unary
-
binoprhs范式,
binoprhs ::= ::= ('bi_op' unary)*
-
primary范式,主要表示式
primary ::= identifierexpr ::= numberexpr ::= arrayexpr ::= parenexpr ::= ifexpr ::= forexpr ::= varexpr
-
numberexpr定义数值对象
numberexpr ::= double ::= integer
-
arrayexpr范式,定义一个数组
arrayexpr :: = '[' expression* ']'
-
parenexpr括号包围的表达式
parenexpr ::= '(' expression ')'
-
如果cur_tok为identifier, 则对象可以是变量或者是函数
identifierexpr ::= identifier ::= identifier '(' expression* ')'
-
def后跟随的是函数原型定义和函数体表达式, 或是变量;P-
definition ::= 'def' prototype expression ::= 'def' identifier expression
-
prototype可以是函数或是binary operator, unary operator的定义 如果是binary定义,必须定义binary operator的优先度
prototype ::= id '((parameter,)*)' ::= binary LETTER number? (parameter, parameter) ::= unary LETTER (parameter)
-
parameter声明范式,分别为声明基本类型,一个数组,以及一个指向基本元素的指针
parameter ::= type id ::= type[integer] id ::= type[] id
-
type范式 type ::= 'int' ::= 'char' ::= 'double'
-
external 范式声明外部函数, 以extern关键词开始
external ::= 'extern' prototype
-
ifelseexpr 条件表达式
ifexpr ::= 'if' expression 'then' expression 'else' expression
-
forexpr 条件循环语句
forexpr ::= 'for' identifier '=' expr ',' (identifier ‘=’ expr)* ;expr (',' expr)? 'in' expression
-
定义变量语句, 以var起始, 定义一个或是多个变量,以‘in’结束定义,这些变量被使用与‘in’后跟随的expression中
varexpr ::= 'var' identifier ('=' expression)?(',' identifier ('=' expression)?)* 'in' expression
-
global语句,定义全局变量
globalexpr ::= 'global' (type) var_name = expr
###Kaleidoscope+
-
增加了垃圾回收功能机制 所有的节点在分配内存时即进行登记注册