Skip to content

pitt-liang/KaleidoscopePlus

Repository files navigation

###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,需要进行以下设置

  1. 需要使用llvm提供的cl.exe进行编译

  2. 包含目录和库目录中需要引入llvm的库目录和头文件目录

  3. clang不支持异常,需增加预处理定义_HAS_EXCEPTIONS=0

  4. 代码生成的运行库需要修改为多线程DLL

  5. 链接器的依赖项中增加llvm的lib文件

  6. 不同的目的机器类型设定Module文件的targettriple属性

###Kaleidoscope++的范式:

  1. top范式表示所有输入

    top ::= definition | external | expression | ';'
    
  2. toplevelexpr范式

    toplevelexpr ::= expression
    
  3. expression范式

     expression
     	::= unary binoprhs
    
  4. unary范式, 首先判断当前的cur_tok是否为unary operator

     unary
     	::= primary
     	::= op unary
    
  5. binoprhs范式,

     binoprhs
     	::=
     	::= ('bi_op' unary)*
    
  6. primary范式,主要表示式

     primary
        ::= identifierexpr
        ::= numberexpr
        ::= arrayexpr
        ::= parenexpr
        ::= ifexpr
        ::= forexpr
        ::= varexpr
    
  7. numberexpr定义数值对象

     numberexpr
     	::= double
     	::= integer
    
  8. arrayexpr范式,定义一个数组

     arrayexpr
     	:: = '[' expression* ']'
    
  9. parenexpr括号包围的表达式

     parenexpr ::= '(' expression ')'
    
  10. 如果cur_tok为identifier, 则对象可以是变量或者是函数

     identifierexpr
     	   ::= identifier
     	   ::= identifier '(' expression* ')'
    
  11. def后跟随的是函数原型定义和函数体表达式, 或是变量;P-

     definition	::= 'def' prototype expression
     			::= 'def' identifier expression
    
  12. prototype可以是函数或是binary operator, unary operator的定义 如果是binary定义,必须定义binary operator的优先度

    prototype
    	::= id '((parameter,)*)'
    	::= binary LETTER number? (parameter, parameter)
    	::= unary LETTER (parameter)
    
  13. parameter声明范式,分别为声明基本类型,一个数组,以及一个指向基本元素的指针

    parameter
    	::= type id
    	::= type[integer] id
    	::= type[] id
    
  14. type范式 type ::= 'int' ::= 'char' ::= 'double'

  15. external 范式声明外部函数, 以extern关键词开始

    external ::= 'extern' prototype
    
  16. ifelseexpr 条件表达式

    ifexpr ::= 'if' expression 'then' expression 'else' expression
    
  17. forexpr 条件循环语句

    forexpr ::= 'for' identifier '=' expr ','  (identifier ‘=’ expr)* ;expr (',' expr)? 'in' expression
    
  18. 定义变量语句, 以var起始, 定义一个或是多个变量,以‘in’结束定义,这些变量被使用与‘in’后跟随的expression中

    varexpr ::= 'var' identifier ('=' expression)?(',' identifier ('=' expression)?)* 'in' expression
    
  19. global语句,定义全局变量

    globalexpr ::= 'global' (type) var_name = expr
    

###Kaleidoscope+

  1. 增加了垃圾回收功能机制 所有的节点在分配内存时即进行登记注册

About

A simple Scripting languages base on LLVM

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages