Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

简介

一个基于LLVM设计的,学习用的类C语言及Toy Compiler

快速使用

首先克隆本项目

安装LLVM

git clone https://github.com/llvm/llvm-project.git

将本项目中Make文件夹中的LLVM-Build.sh拷贝到llvm-project,执行:

mkdir build && cd build
../LLVM-Build.sh

编译本项目

在本项目根目录下执行

./build.sh

使用

目前可以生成.o或者ELF(生成ELF请确保机器中安装了clang)

  1. 生成.o文件
./bin/XAC ./test/main.xa ./bin/main.o
  1. 生成ELF文件
./bin/XAC ./test/main.xa ./bin/main

关于语言本身

最初是用来学习LLVM才写的,风格基本模仿C语言,但是设想了一些特性(虽然大部分都没实现……)

  • 赋值不允许作为表达式单独存在
    来源于无数次写if(a=1)导致的bug折磨,干脆禁掉赋值语句的返回值(语句怎么能有返回值呢),虽然也导致不能连等号赋值了
  • 不允许定义和标准库同名的函数
    这个特性是专门针对python这样的,也是无数次把某个库里的函数名作为自定义函数导致库用不了,于是怒而想怎么能让使用者定义的函数毁掉标准库呢……
  • 强制指针类型初始化
    应该挺容易实现,指针变量声明时单独设置规则不允许只声明应该就可以
  • 指针边界
    设想后续优化指针类型加入一个长度限制,比如Num64*,长度应该是8个字节,做指针加减时做些check,但具体怎么实现还没想好;希望能达到C/C++的内存遍历简洁,同时保证不越界

TODO

  • 目前已支持:
    1. 函数声明(声明同时定义,或者仅声明)
    2. 函数调用
    3. 分支控制
    4. 变量声明(声明同时赋值,或者仅赋值)、
    5. 链接C的printf、scanf的IO
    6. 变量赋值、变量引用、加减乘除、大于、小于、等于
    7. 基础的指针语法(&x、*p),但还不支持 *&x以及&*p等语法
    8. 初步的作用域功能
  • 下一步计划完善指针功能,实现类型检查、作用域机制
  • for循环先不写了……

目前不支持的一些机制

  • 各种语法糖:x+=1、a*=3这种
  • 多个分支:if-else if-else if……else这种
  • 类型检查
  • 循环控制
  • 函数声明、参数声明时不支持指针,比如Num64* func这种,以及Num64 func(Num64* p),都是不合法的

语法规定

支持的数据类型:

  • Char类型,同C
  • Num64数值,即QWORD,64位整数
  • Num32数值,即DWORD,32位整数
  • Num16数值,即WORD,16位整数
  • Num8数值,即BYTE,8位整数
  • String,字符串

其他语法

同C/C++,详见test/main.xa

终止符

同C/C++,每条语句以;结尾

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages