Compare commits
No commits in common. 'cfc2c6207dd3618efa970dfc5e61988dff8f52ab' and 'dab3153471de35d1af0e333516aca2303b171a90' have entirely different histories.
cfc2c6207d
...
dab3153471
@ -0,0 +1,3 @@
|
||||
.DS_STORE
|
||||
cmake-build-debug/
|
||||
build/
|
@ -0,0 +1,37 @@
|
||||
project(SysYFCompiler)
|
||||
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -Wall -Wextra -Wno-unused -Wshadow -g -pedantic")
|
||||
|
||||
# include generated files in project environment
|
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/AST)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/ErrorReporter)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/Frontend)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/SysYFIR)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/SysYFIRBuilder)
|
||||
|
||||
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/AST)
|
||||
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/ErrorReporter)
|
||||
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/Frontend)
|
||||
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/SysYFIR)
|
||||
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/SysYFIRBuilder)
|
||||
|
||||
add_executable(
|
||||
SysYFCompiler
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp
|
||||
)
|
||||
|
||||
target_link_libraries(
|
||||
SysYFCompiler
|
||||
SysYFIRBuilder
|
||||
IRLib
|
||||
Driver
|
||||
ASTPrinter
|
||||
ErrReporter
|
||||
)
|
@ -0,0 +1,28 @@
|
||||
int num[2] = {4, 8};
|
||||
int x[1];
|
||||
int n;
|
||||
int tmp = 1;
|
||||
|
||||
int climbStairs(int n) {
|
||||
if(n < 4)
|
||||
return n;
|
||||
int dp[10];
|
||||
dp[0] = 0;
|
||||
dp[1] = 1;
|
||||
dp[2] = 2;
|
||||
int i;
|
||||
i = 3;
|
||||
while(i<n+1){
|
||||
dp[i] = dp[i-1] + dp[i-2];
|
||||
i = i + 1;
|
||||
}
|
||||
return dp[n];
|
||||
}
|
||||
|
||||
int main(){
|
||||
int res;
|
||||
n=num[0];
|
||||
x[0] = num[tmp];
|
||||
res = climbStairs(n + tmp);
|
||||
return res - x[0];
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
define i32 @main() #0 {
|
||||
; alloc b and store 1.8 to b
|
||||
%1 = alloca float, align 4 ;b
|
||||
store float 0x3FFCCCCCC0000000, float* %1, align 4
|
||||
|
||||
; alloc a[2] and store 2 to a[0]
|
||||
%2 = alloca [2 x i32], align 4 ;a
|
||||
%3 = getelementptr inbounds [2 x i32], [2 x i32]* %2, i64 0, i64 0 ;a[0]
|
||||
store i32 2, i32* %3
|
||||
|
||||
; load b
|
||||
%4 = load float, float* %1, align 4
|
||||
|
||||
; load a[0] and convert to float
|
||||
%5 = getelementptr inbounds [2 x i32], [2 x i32]* %2, i64 0, i64 0 ;a[0]
|
||||
%6 = load i32, i32* %5, align 4
|
||||
%7 = sitofp i32 %6 to float ;a[0] to float
|
||||
|
||||
; calculate b * a[0]
|
||||
%8 = fmul float %4, %7
|
||||
%9 = fptosi float %8 to i32
|
||||
|
||||
; store to a[1]
|
||||
%10 = getelementptr inbounds [2 x i32], [2 x i32]* %2, i64 0, i64 1 ;a[1]
|
||||
store i32 %9, i32* %10, align 4;
|
||||
%11 = load i32, i32* %10, align 4
|
||||
|
||||
; return a[1]
|
||||
ret i32 %11
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
; 中间代码头部尾部参考clang -S -emit-llvm 生成结果
|
||||
|
||||
; ModuleID = 'func_test.c'
|
||||
source_filename = "func_test.c"
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-pc-linux-gnu"
|
||||
|
||||
define dso_local i32 @add(i32 %0, i32 %1) #0 {
|
||||
%3 = alloca i32, align 4
|
||||
store i32 %0, i32* %3, align 4 ; alloca a
|
||||
|
||||
%4 = alloca i32, align 4
|
||||
store i32 %1, i32* %4, align 4 ; alloca b
|
||||
|
||||
%5 = load i32, i32* %3, align 4
|
||||
%6 = load i32, i32* %4, align 4
|
||||
%7 = add nsw i32 %5, %6 ; a+b
|
||||
%8 = sub nsw i32 %7, 1 ; a+b-1
|
||||
ret i32 %8 ; return a+b-1
|
||||
}
|
||||
|
||||
define dso_local i32 @main() #0 {
|
||||
%1 = alloca i32, align 4
|
||||
%2 = alloca i32, align 4
|
||||
%3 = alloca i32, align 4
|
||||
|
||||
store i32 3, i32* %1, align 4 ; a=3
|
||||
store i32 2, i32* %2, align 4 ; b=2
|
||||
store i32 5, i32* %3, align 4 ; c=5
|
||||
|
||||
|
||||
%4 = load i32, i32* %1, align 4
|
||||
%5 = load i32, i32* %2, align 4
|
||||
%6 = load i32, i32* %3, align 4
|
||||
|
||||
%7 = call i32 @add(i32 %4, i32 %5) ; add(a, b)
|
||||
%8 = add nsw i32 %6, %7 ; c+add(a,b)
|
||||
ret i32 %8
|
||||
}
|
||||
|
||||
attributes #0 = { noinline nounwind optnone uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
|
||||
|
||||
!llvm.module.flags = !{!0, !1, !2, !3, !4}
|
||||
!llvm.ident = !{!5}
|
||||
|
||||
!0 = !{i32 1, !"wchar_size", i32 4}
|
||||
!1 = !{i32 7, !"PIC Level", i32 2}
|
||||
!2 = !{i32 7, !"PIE Level", i32 2}
|
||||
!3 = !{i32 7, !"uwtable", i32 1}
|
||||
!4 = !{i32 7, !"frame-pointer", i32 2}
|
||||
!5 = !{!"Ubuntu clang version 14.0.0-1ubuntu1.1"}
|
@ -0,0 +1,11 @@
|
||||
@a = common global i32 0, align 4
|
||||
define i32 @main() #0 {
|
||||
store i32 10, i32* @a, align 4
|
||||
%1 = load i32, i32* @a, align 4
|
||||
%2 = icmp sgt i32 %1, 0
|
||||
br i1 %2, label %3, label %4
|
||||
3:
|
||||
ret i32 %1
|
||||
4:
|
||||
ret i32 0
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
int main(){
|
||||
float b = 1.8;
|
||||
int a[2] = {2};
|
||||
a[1] = a[0] * b;
|
||||
return a[1];
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
int add(int a,int b){
|
||||
return (a+b-1);
|
||||
}
|
||||
|
||||
int main(){
|
||||
int a;
|
||||
int b;
|
||||
int c;
|
||||
a=3;
|
||||
b=2;
|
||||
c = 5;
|
||||
return c + add(a,b);
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
int a;
|
||||
|
||||
int main(){
|
||||
a = 10;
|
||||
if( a>0 ){
|
||||
return a;
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
int a;
|
||||
int b;
|
||||
int main(){
|
||||
b=0;
|
||||
a=3;
|
||||
while(a>0){
|
||||
b = b+a;
|
||||
a = a-1;
|
||||
}
|
||||
return b;
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
project(task2)
|
||||
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -Wall -g -pedantic")
|
||||
|
||||
set(SYSYF_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../)
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
# include generated files in project environment
|
||||
include_directories(${SYSYF_SOURCE_DIR}include)
|
||||
include_directories(${SYSYF_SOURCE_DIR}include/SysYFIR)
|
||||
add_subdirectory(${SYSYF_SOURCE_DIR}src/SysYFIR src/SysYFIR)
|
||||
|
||||
add_subdirectory(demo)
|
||||
add_subdirectory(cpp)
|
@ -0,0 +1,36 @@
|
||||
add_executable(
|
||||
assign_generator
|
||||
assign_gen.cpp
|
||||
)
|
||||
target_link_libraries(
|
||||
assign_generator
|
||||
IRLib
|
||||
)
|
||||
|
||||
add_executable(
|
||||
func_generator
|
||||
func_gen.cpp
|
||||
)
|
||||
target_link_libraries(
|
||||
func_generator
|
||||
IRLib
|
||||
)
|
||||
|
||||
add_executable(
|
||||
if_generator
|
||||
if_gen.cpp
|
||||
)
|
||||
target_link_libraries(
|
||||
if_generator
|
||||
IRLib
|
||||
)
|
||||
|
||||
add_executable(
|
||||
while_generator
|
||||
while_gen.cpp
|
||||
)
|
||||
target_link_libraries(
|
||||
while_generator
|
||||
IRLib
|
||||
)
|
||||
|
@ -0,0 +1,66 @@
|
||||
#include "BasicBlock.h"
|
||||
#include "Constant.h"
|
||||
#include "Function.h"
|
||||
#include "IRStmtBuilder.h"
|
||||
#include "Module.h"
|
||||
#include "Type.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DEBUG_OUTPUT std::cout << __LINE__ << std::endl; // 输出行号的简单示例
|
||||
#else
|
||||
#define DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
#define CONST_INT(num) \
|
||||
ConstantInt::create(num, module)
|
||||
|
||||
#define CONST_FP(num) \
|
||||
ConstantFloat::create(num, module)
|
||||
|
||||
using namespace SysYF::IR;
|
||||
|
||||
int main() {
|
||||
auto module = Module::create("Assign code");
|
||||
auto builder = IRStmtBuilder::create(nullptr, module);
|
||||
SysYF::Ptr<Type> Int32Type = Type::get_int32_type(module);
|
||||
SysYF::Ptr<Type> FloatType = Type::get_float_type(module);
|
||||
|
||||
// main function
|
||||
auto mainFun = Function::create(FunctionType::create(Int32Type, {}),
|
||||
"main", module);
|
||||
auto bb = BasicBlock::create(module, "entry", mainFun);
|
||||
builder->set_insert_point(bb);
|
||||
auto retAlloca = builder->create_alloca(Int32Type);
|
||||
|
||||
// b = 1.8
|
||||
auto bAlloca = builder->create_alloca(FloatType);
|
||||
builder->create_store(CONST_FP(1.8), bAlloca);
|
||||
|
||||
// a[2] = {2}
|
||||
auto arrayType_a = ArrayType::get(Int32Type, 2);
|
||||
auto aAlloca = builder->create_alloca(arrayType_a);
|
||||
auto a0Gep = builder->create_gep(aAlloca, {CONST_INT(0), CONST_INT(0)});
|
||||
builder->create_store(CONST_INT(2), a0Gep);
|
||||
|
||||
// a[0] * b
|
||||
auto a0Load = builder->create_load(a0Gep);
|
||||
auto a0Float = builder->create_sitofp(a0Load, FloatType);
|
||||
auto bLoad = builder->create_load(FloatType, bAlloca);
|
||||
auto a1res = builder->create_fmul(a0Float, bLoad);
|
||||
|
||||
// store to a[1]
|
||||
auto a1res_int = builder->create_fptosi(a1res, Int32Type);
|
||||
auto a1Gep = builder->create_gep(aAlloca, {CONST_INT(0), CONST_INT(1)});
|
||||
builder->create_store(a1res_int, a1Gep);
|
||||
|
||||
// ret
|
||||
builder->create_store(a1res_int, retAlloca);
|
||||
auto retLoad = builder->create_load(retAlloca);
|
||||
builder->create_ret(retLoad);
|
||||
|
||||
std::cout << module->print();
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,113 @@
|
||||
#include "BasicBlock.h"
|
||||
#include "Constant.h"
|
||||
#include "Function.h"
|
||||
#include "IRStmtBuilder.h"
|
||||
#include "Module.h"
|
||||
#include "Type.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
|
||||
#ifdef DEBUG // 用于调试信息,大家可以在编译过程中通过" -DDEBUG"来开启这一选项
|
||||
#define DEBUG_OUTPUT std::cout << __LINE__ << std::endl; // 输出行号的简单示例
|
||||
#else
|
||||
#define DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
#define CONST_INT(num) \
|
||||
ConstantInt::create(num, module)
|
||||
|
||||
#define CONST_FP(num) \
|
||||
ConstantFloat::create(num, module) // 得到常数值的表示,方便后面多次用到
|
||||
|
||||
using namespace SysYF::IR;
|
||||
|
||||
int main() {
|
||||
auto module = Module::create("SysYF code"); // module name是什么无关紧要
|
||||
auto builder = IRStmtBuilder::create(nullptr, module);
|
||||
SysYF::Ptr<Type> Int32Type = Type::get_int32_type(module);
|
||||
|
||||
// add(a, b)
|
||||
// 函数参数类型的vector
|
||||
std::vector<SysYF::Ptr<Type>> Ints(2, Int32Type);
|
||||
|
||||
//通过返回值类型与参数类型列表得到函数类型
|
||||
auto addFunTy = FunctionType::create(Int32Type, Ints);
|
||||
|
||||
// 由函数类型得到函数
|
||||
auto addFun = Function::create(addFunTy,
|
||||
"add", module);
|
||||
|
||||
// BB的名字在生成中无所谓,但是可以方便阅读
|
||||
auto bb = BasicBlock::create(module, "entry", addFun);
|
||||
|
||||
builder->set_insert_point(bb); // 一个BB的开始,将当前插入指令点的位置设在bb
|
||||
|
||||
auto retAlloca = builder->create_alloca(Int32Type); // 在内存中分配返回值的位置
|
||||
auto aAlloca = builder->create_alloca(Int32Type); // 在内存中分配参数a的位置
|
||||
auto bAlloca = builder->create_alloca(Int32Type); // 在内存中分配参数b的位置
|
||||
|
||||
std::vector<SysYF::Ptr<Value>> args; // 获取add函数的形参,通过Function中的iterator
|
||||
for (auto arg = addFun->arg_begin(); arg != addFun->arg_end(); arg++) {
|
||||
args.push_back(*arg); // * 号运算符是从迭代器中取出迭代器当前指向的元素
|
||||
}
|
||||
|
||||
builder->create_store(args[0], aAlloca); // store参数a
|
||||
builder->create_store(args[1], bAlloca); // store参数b
|
||||
|
||||
auto aLoad = builder->create_load(aAlloca); // load参数a
|
||||
auto bLoad = builder->create_load(bAlloca); // load参数b
|
||||
|
||||
// a+b
|
||||
auto add = builder->create_iadd(aLoad, bLoad);
|
||||
|
||||
// a+b-1
|
||||
auto sub = builder->create_isub(add, CONST_INT(1));
|
||||
|
||||
builder->create_store(sub, retAlloca);
|
||||
auto retLoad = builder->create_load(retAlloca);
|
||||
builder->create_ret(retLoad);
|
||||
builder->create_ret(retLoad);
|
||||
|
||||
// main函数
|
||||
auto mainFun = Function::create(FunctionType::create(Int32Type, {}),
|
||||
"main", module);
|
||||
bb = BasicBlock::create(module, "entry", mainFun);
|
||||
// BasicBlock的名字在生成中无所谓,但是可以方便阅读
|
||||
builder->set_insert_point(bb);
|
||||
|
||||
retAlloca = builder->create_alloca(Int32Type);
|
||||
|
||||
// int a;
|
||||
auto a = builder->create_alloca(Int32Type);
|
||||
|
||||
// int b;
|
||||
auto b = builder->create_alloca(Int32Type);
|
||||
|
||||
// int c;
|
||||
auto c = builder->create_alloca(Int32Type);
|
||||
|
||||
// a = 3;
|
||||
builder->create_store(CONST_INT(3), a);
|
||||
|
||||
// b = 2;
|
||||
builder->create_store(CONST_INT(2), b);
|
||||
|
||||
// c = 5;
|
||||
builder->create_store(CONST_INT(5), c);
|
||||
|
||||
// tmp = add(a, b);
|
||||
aLoad = builder->create_load(a);
|
||||
bLoad = builder->create_load(b);
|
||||
auto tmp = builder->create_call(addFun, {aLoad, bLoad});
|
||||
|
||||
// ret = c + tmp;
|
||||
auto cLoad = builder->create_load(c);
|
||||
auto ret = builder->create_iadd(cLoad, tmp);
|
||||
builder->create_store(ret, retAlloca);
|
||||
retLoad = builder->create_load(retAlloca);
|
||||
builder->create_ret(retLoad);
|
||||
|
||||
std::cout << module->print();
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
#include "BasicBlock.h"
|
||||
#include "Constant.h"
|
||||
#include "Function.h"
|
||||
#include "IRStmtBuilder.h"
|
||||
#include "Module.h"
|
||||
#include "Type.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DEBUG_OUTPUT std::cout << __LINE__ << std::endl; // 输出行号的简单示例
|
||||
#else
|
||||
#define DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
#define CONST_INT(num) \
|
||||
ConstantInt::create(num, module)
|
||||
|
||||
#define CONST_FP(num) \
|
||||
ConstantFloat::create(num, module)
|
||||
|
||||
using namespace SysYF::IR;
|
||||
|
||||
int main() {
|
||||
auto module = Module::create("If code");
|
||||
auto builder = IRStmtBuilder::create(nullptr, module);
|
||||
SysYF::Ptr<Type> Int32Type = Type::get_int32_type(module);
|
||||
SysYF::Ptr<Type> FloatType = Type::get_float_type(module);
|
||||
|
||||
auto zero_initializer = ConstantZero::create(Int32Type, module);
|
||||
auto a = GlobalVariable::create("a", module, Int32Type, false, zero_initializer);
|
||||
|
||||
// main function
|
||||
auto mainFun = Function::create(FunctionType::create(Int32Type, {}),
|
||||
"main", module);
|
||||
auto bb = BasicBlock::create(module, "entry", mainFun);
|
||||
builder->set_insert_point(bb);
|
||||
auto retAlloca = builder->create_alloca(Int32Type);
|
||||
|
||||
// store 10 to a
|
||||
builder->create_store(CONST_INT(10), a);
|
||||
auto aValue = builder->create_load(a);
|
||||
|
||||
// if(a > 0)
|
||||
auto icmp = builder->create_icmp_gt(aValue, CONST_INT(0));
|
||||
auto trueBB = BasicBlock::create(module, "trueBB_if", mainFun); // true分支
|
||||
auto falseBB = BasicBlock::create(module, "falseBB_if", mainFun); // false分支
|
||||
builder->create_cond_br(icmp, trueBB, falseBB); // 条件BR
|
||||
|
||||
// if true return a
|
||||
builder->set_insert_point(trueBB);
|
||||
builder->create_ret(aValue);
|
||||
|
||||
// if false return 0
|
||||
builder->set_insert_point(falseBB);
|
||||
builder->create_ret(CONST_INT(0));
|
||||
|
||||
std::cout << module->print();
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
#include "BasicBlock.h"
|
||||
#include "Constant.h"
|
||||
#include "Function.h"
|
||||
#include "IRStmtBuilder.h"
|
||||
#include "Module.h"
|
||||
#include "Type.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
|
||||
#ifdef DEBUG // 用于调试信息,大家可以在编译过程中通过" -DDEBUG"来开启这一选项
|
||||
#define DEBUG_OUTPUT std::cout << __LINE__ << std::endl; // 输出行号的简单示例
|
||||
#else
|
||||
#define DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
#define CONST_INT(num) \
|
||||
ConstantInt::create(num, module)
|
||||
|
||||
#define CONST_FP(num) \
|
||||
ConstantFloat::create(num, module) // 得到常数值的表示,方便后面多次用到
|
||||
|
||||
using namespace SysYF::IR;
|
||||
|
||||
int main() {
|
||||
auto module = Module::create("SysYF code"); // module name是什么无关紧要
|
||||
auto builder = IRStmtBuilder::create(nullptr, module);
|
||||
SysYF::Ptr<Type> Int32Type = Type::get_int32_type(module);
|
||||
|
||||
// int a;
|
||||
auto a = GlobalVariable::create("a", module, Int32Type, false, CONST_INT(0));
|
||||
|
||||
// int b;
|
||||
auto b = GlobalVariable::create("b", module, Int32Type, false, CONST_INT(0));
|
||||
|
||||
// main函数
|
||||
auto mainFun = Function::create(FunctionType::create(Int32Type, {}),
|
||||
"main", module);
|
||||
auto bb = BasicBlock::create(module, "entry", mainFun);
|
||||
// BasicBlock的名字在生成中无所谓,但是可以方便阅读
|
||||
builder->set_insert_point(bb);
|
||||
|
||||
auto retAlloca = builder->create_alloca(Int32Type);
|
||||
|
||||
// b=0;
|
||||
builder->create_store(CONST_INT(0), b);
|
||||
|
||||
// a = 3;
|
||||
builder->create_store(CONST_INT(3), a);
|
||||
|
||||
// whileBBs
|
||||
auto condBB = BasicBlock::create(module, "condBB_while", mainFun);
|
||||
auto trueBB = BasicBlock::create(module, "trueBB_while", mainFun);
|
||||
auto falseBB = BasicBlock::create(module, "falseBB_while", mainFun);
|
||||
|
||||
builder->create_br(condBB);
|
||||
|
||||
// condBB
|
||||
builder->set_insert_point(condBB);
|
||||
auto aLoad = builder->create_load(a);
|
||||
auto icmp = builder->create_icmp_gt(aLoad, CONST_INT(0));
|
||||
builder->create_cond_br(icmp, trueBB, falseBB);
|
||||
|
||||
// trueBB
|
||||
builder->set_insert_point(trueBB);
|
||||
aLoad = builder->create_load(a);
|
||||
auto bLoad = builder->create_load(b);
|
||||
auto add = builder->create_iadd(bLoad, aLoad);
|
||||
builder->create_store(add, b);
|
||||
auto sub = builder->create_isub(aLoad, CONST_INT(1));
|
||||
builder->create_store(sub, a);
|
||||
builder->create_br(condBB);
|
||||
|
||||
// falseBB
|
||||
builder->set_insert_point(falseBB);
|
||||
bLoad = builder->create_load(b);
|
||||
builder->create_store(bLoad, retAlloca);
|
||||
auto retLoad = builder->create_load(retAlloca);
|
||||
builder->create_ret(retLoad);
|
||||
|
||||
std::cout << module->print();
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
add_executable(
|
||||
go_upstairs_generator
|
||||
go_upstairs_gen.cpp
|
||||
)
|
||||
target_link_libraries(
|
||||
go_upstairs_generator
|
||||
IRLib
|
||||
)
|
@ -0,0 +1,28 @@
|
||||
int num[2] = {4, 8};
|
||||
int x[1];
|
||||
int n;
|
||||
int tmp = 1;
|
||||
|
||||
int climbStairs(int n) {
|
||||
if(n < 4)
|
||||
return n;
|
||||
int dp[10];
|
||||
dp[0] = 0;
|
||||
dp[1] = 1;
|
||||
dp[2] = 2;
|
||||
int i;
|
||||
i = 3;
|
||||
while(i<n+1){
|
||||
dp[i] = dp[i-1] + dp[i-2];
|
||||
i = i + 1;
|
||||
}
|
||||
return dp[n];
|
||||
}
|
||||
|
||||
int main(){
|
||||
int res;
|
||||
n=num[0];
|
||||
x[0] = num[tmp];
|
||||
res = climbStairs(n + tmp);
|
||||
return res - x[0];
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
int main(){
|
||||
float b = 1.8;
|
||||
int a[2] = {2};
|
||||
a[1] = a[0] * b;
|
||||
return a[1];
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
int add(int a,int b){
|
||||
return (a+b-1);
|
||||
}
|
||||
|
||||
int main(){
|
||||
int a;
|
||||
int b;
|
||||
int c;
|
||||
a=3;
|
||||
b=2;
|
||||
c = 5;
|
||||
return c + add(a,b);
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
int a;
|
||||
|
||||
int main(){
|
||||
a = 10;
|
||||
if( a>0 ){
|
||||
return a;
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
int a;
|
||||
int b;
|
||||
int main(){
|
||||
b=0;
|
||||
a=3;
|
||||
while(a>0){
|
||||
b = b+a;
|
||||
a = a-1;
|
||||
}
|
||||
return b;
|
||||
}
|
@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env python3
|
||||
import subprocess
|
||||
import os
|
||||
|
||||
IRBuild_ptn = '"{}" "-emit-ir" "-o" "{}" "{}"'
|
||||
ExeGen_ptn = '"clang" "{}" "-o" "{}" "{}" "../../lib/lib.c"'
|
||||
Exe_ptn = '"{}"'
|
||||
|
||||
def eval(EXE_PATH, TEST_BASE_PATH, optimization):
|
||||
print('===========TEST START===========')
|
||||
print('now in {}'.format(TEST_BASE_PATH))
|
||||
dir_succ = True
|
||||
for case in testcases:
|
||||
print('Case %s:' % case, end='')
|
||||
TEST_PATH = TEST_BASE_PATH + case
|
||||
SY_PATH = TEST_BASE_PATH + case + '.sy'
|
||||
LL_PATH = TEST_BASE_PATH + case + '.ll'
|
||||
INPUT_PATH = TEST_BASE_PATH + case + '.in'
|
||||
OUTPUT_PATH = TEST_BASE_PATH + case + '.out'
|
||||
need_input = testcases[case]
|
||||
|
||||
IRBuild_result = subprocess.run(IRBuild_ptn.format(EXE_PATH, LL_PATH, SY_PATH), shell=True, stderr=subprocess.PIPE)
|
||||
if IRBuild_result.returncode == 0:
|
||||
input_option = None
|
||||
if need_input:
|
||||
with open(INPUT_PATH, "rb") as fin:
|
||||
input_option = fin.read()
|
||||
|
||||
try:
|
||||
subprocess.run(ExeGen_ptn.format(optimization, TEST_PATH, LL_PATH), shell=True, stderr=subprocess.PIPE)
|
||||
result = subprocess.run(Exe_ptn.format(TEST_PATH), shell=True, input=input_option, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
out = result.stdout.split(b'\n')
|
||||
if result.returncode != b'':
|
||||
out.append(str(result.returncode).encode())
|
||||
for i in range(len(out)-1, -1, -1):
|
||||
out[i] = out[i].strip(b'\r')
|
||||
if out[i] == b'':
|
||||
out.remove(b'')
|
||||
case_succ = True
|
||||
with open(OUTPUT_PATH, "rb") as fout:
|
||||
print(out[i])
|
||||
i = 0
|
||||
for line in fout.readlines():
|
||||
line = line.strip(b'\r').strip(b'\n')
|
||||
if line == '':
|
||||
continue
|
||||
if out[i] != line:
|
||||
dir_succ = False
|
||||
case_succ = False
|
||||
i = i + 1
|
||||
if case_succ:
|
||||
print('\t\033[32mPass\033[0m')
|
||||
else:
|
||||
print('\t\033[31mWrong Answer\033[0m')
|
||||
except Exception as _:
|
||||
dir_succ = False
|
||||
print(_, end='')
|
||||
print('\t\033[31mCodeGen or CodeExecute Fail\033[0m')
|
||||
finally:
|
||||
subprocess.call(["rm", "-rf", TEST_PATH, TEST_PATH])
|
||||
subprocess.call(["rm", "-rf", TEST_PATH, TEST_PATH + ".o"])
|
||||
subprocess.call(["rm", "-rf", TEST_PATH, TEST_PATH + ".ll"])
|
||||
|
||||
else:
|
||||
dir_succ = False
|
||||
print('\t\033[31mIRBuild Fail\033[0m')
|
||||
if dir_succ:
|
||||
print('\t\033[32mSuccess\033[0m in dir {}'.format(TEST_BASE_PATH))
|
||||
else:
|
||||
print('\t\033[31mFail\033[0m in dir {}'.format(TEST_BASE_PATH))
|
||||
|
||||
print('============TEST END============')
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
# you can only modify this to add your testcase
|
||||
TEST_DIRS = [
|
||||
'./test/',
|
||||
]
|
||||
# you can only modify this to add your testcase
|
||||
|
||||
optimization = "-O0" # -O0 -O1 -O2 -O3 -O4(currently = -O3) -Ofast
|
||||
for TEST_BASE_PATH in TEST_DIRS:
|
||||
testcases = {} # { name: need_input }
|
||||
EXE_PATH = os.path.abspath('../../build/SysYFCompiler')
|
||||
testcase_list = list(map(lambda x: x.split('.'), os.listdir(TEST_BASE_PATH)))
|
||||
testcase_list.sort()
|
||||
for i in range(len(testcase_list)):
|
||||
testcases[testcase_list[i][0]] = False
|
||||
for i in range(len(testcase_list)):
|
||||
testcases[testcase_list[i][0]] = testcases[testcase_list[i][0]] | (testcase_list[i][1] == 'in')
|
||||
eval(EXE_PATH, TEST_BASE_PATH, optimization=optimization)
|
@ -0,0 +1 @@
|
||||
0
|
@ -0,0 +1,3 @@
|
||||
int main(){
|
||||
return 0;
|
||||
}
|
@ -0,0 +1 @@
|
||||
29
|
@ -0,0 +1,8 @@
|
||||
int a,b;
|
||||
|
||||
int main(){
|
||||
a=10;
|
||||
b=5;
|
||||
int c=a*2+b*1.1+3.6;
|
||||
return c;
|
||||
}
|
@ -0,0 +1 @@
|
||||
21
|
@ -0,0 +1,5 @@
|
||||
int main() {
|
||||
int a = 10;
|
||||
;
|
||||
return a * 2 + 1;
|
||||
}
|
@ -0,0 +1 @@
|
||||
0
|
@ -0,0 +1,4 @@
|
||||
int a[10];
|
||||
int main(){
|
||||
return 0;
|
||||
}
|
@ -0,0 +1 @@
|
||||
0
|
@ -0,0 +1,5 @@
|
||||
int a[10];
|
||||
int main(){
|
||||
a[0]=1;
|
||||
return 0;
|
||||
}
|
@ -0,0 +1 @@
|
||||
4
|
@ -0,0 +1,5 @@
|
||||
const int x=4;
|
||||
|
||||
int main(){
|
||||
return x;
|
||||
}
|
@ -0,0 +1 @@
|
||||
8
|
@ -0,0 +1,7 @@
|
||||
const int a[5]={0,1,2,3,4};
|
||||
const int b = 3;
|
||||
float c = a[b + 1];
|
||||
|
||||
int main(){
|
||||
return a[4] + c;
|
||||
}
|
@ -0,0 +1 @@
|
||||
4
|
@ -0,0 +1,8 @@
|
||||
int defn(){
|
||||
return 4;
|
||||
}
|
||||
|
||||
int main(){
|
||||
int a=defn();
|
||||
return a;
|
||||
}
|
@ -0,0 +1 @@
|
||||
5
|
@ -0,0 +1,13 @@
|
||||
int a,b,c;
|
||||
|
||||
void add(int a,int b){
|
||||
c=a+b;
|
||||
return;
|
||||
}
|
||||
|
||||
int main(){
|
||||
a=3;
|
||||
b=2;
|
||||
add(a,b);
|
||||
return c;
|
||||
}
|
@ -0,0 +1 @@
|
||||
1
|
@ -0,0 +1,9 @@
|
||||
int a;
|
||||
|
||||
int main(){
|
||||
a = 10;
|
||||
if( a>0 ){
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -0,0 +1 @@
|
||||
1
|
@ -0,0 +1,10 @@
|
||||
int a;
|
||||
int main(){
|
||||
a = 10;
|
||||
if( a>0 ){
|
||||
return 1;
|
||||
}
|
||||
else{
|
||||
return 0;
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
6
|
@ -0,0 +1,11 @@
|
||||
int a;
|
||||
int b;
|
||||
int main(){
|
||||
b=0;
|
||||
a=3;
|
||||
while(a>0){
|
||||
b = b+a;
|
||||
a = a-1;
|
||||
}
|
||||
return b;
|
||||
}
|
@ -0,0 +1 @@
|
||||
5
|
@ -0,0 +1,9 @@
|
||||
int main(){
|
||||
int a=10;
|
||||
while(a>0){
|
||||
a=a-1;
|
||||
if(a==5)
|
||||
break;
|
||||
}
|
||||
return a;
|
||||
}
|
@ -0,0 +1 @@
|
||||
5
|
@ -0,0 +1,11 @@
|
||||
int main(){
|
||||
int a=10;
|
||||
while(a>0){
|
||||
if(a>5){
|
||||
a=a-1;
|
||||
continue;
|
||||
}
|
||||
return a;
|
||||
}
|
||||
return a;
|
||||
}
|
@ -0,0 +1 @@
|
||||
10
|
@ -0,0 +1 @@
|
||||
10
|
@ -0,0 +1,5 @@
|
||||
int main(){
|
||||
int a;
|
||||
a = getint();
|
||||
return a;
|
||||
}
|
@ -0,0 +1 @@
|
||||
5
|
@ -0,0 +1,23 @@
|
||||
int a;
|
||||
|
||||
int myFunc(int a, int b, int c) {
|
||||
a = 2;
|
||||
{
|
||||
int c;
|
||||
c = 0;
|
||||
if (c != 0) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
while (b > 0) {
|
||||
b = b - 1;
|
||||
}
|
||||
return (a)+(b);
|
||||
}
|
||||
|
||||
int main() {
|
||||
a = (3);
|
||||
int b;
|
||||
b = myFunc(1, 2, 1);
|
||||
return ((a+b));
|
||||
}
|
@ -0,0 +1 @@
|
||||
3 2
|
@ -0,0 +1 @@
|
||||
0
|
@ -0,0 +1,12 @@
|
||||
int a;
|
||||
int b;
|
||||
int main(){
|
||||
a = getint();
|
||||
b = getint();
|
||||
if ( a == b ){
|
||||
return 1;
|
||||
}
|
||||
else{
|
||||
return 0;
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
8
|
@ -0,0 +1,17 @@
|
||||
const int a = 5;
|
||||
int b;
|
||||
|
||||
int my_sum(int x, float y){
|
||||
b = a + x - y;
|
||||
return b;
|
||||
}
|
||||
|
||||
int main(){
|
||||
int a = 7;
|
||||
{
|
||||
const float a = 3.3;
|
||||
my_sum(a, a);
|
||||
}
|
||||
my_sum(a, b);
|
||||
return b;
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
4
|
||||
20
|
@ -0,0 +1 @@
|
||||
4
|
@ -0,0 +1,34 @@
|
||||
int n;
|
||||
|
||||
int gcd(int m,int n)
|
||||
{
|
||||
int t;
|
||||
int r;
|
||||
|
||||
if(m<n) { t=m;m=n;n=t; }
|
||||
|
||||
r=m%n;
|
||||
|
||||
while(r!=0)
|
||||
{
|
||||
m=n;
|
||||
n=r;
|
||||
r=m%n;
|
||||
}
|
||||
|
||||
return n;
|
||||
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
//newline=10;
|
||||
int i;
|
||||
int m;
|
||||
//m = 1478;
|
||||
//int t;
|
||||
i=getint();
|
||||
m=getint();
|
||||
|
||||
return gcd(i,m);
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
4
|
||||
4
|
||||
7
|
||||
3
|
||||
9
|
@ -0,0 +1,5 @@
|
||||
1 2, 1 3, 2 3, 1 2, 3 1, 3 2, 1 2, 1 3, 2 3, 2 1, 3 1, 2 3, 1 2, 1 3, 2 3,
|
||||
1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 3 1, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 3 1, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3,
|
||||
1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3,
|
||||
1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 3 1, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 3 1, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 3 1, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 3 1, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 3 1, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 3 1, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 3 1, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 3 1, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 3 1, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 3 1, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 3 1, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 3 1, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 1 2, 3 2, 3 1, 2 1, 3 2, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3, 2 1, 3 2, 3 1, 2 1, 2 3, 1 3, 1 2, 3 2, 1 3, 2 1, 2 3, 1 3,
|
||||
0
|
@ -0,0 +1,27 @@
|
||||
|
||||
void move(int x, int y)
|
||||
{
|
||||
putint(x); putch(32); putint(y); putch(44); putch(32);
|
||||
}
|
||||
|
||||
void hanoi(int n, int one, int two, int three)
|
||||
{
|
||||
if (n == 1)
|
||||
move(one, three);
|
||||
else {
|
||||
hanoi(n - 1, one, three, two);
|
||||
move(one, three);
|
||||
hanoi(n - 1, two, one, three);
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int n = getint();
|
||||
while (n > 0) {
|
||||
hanoi(getint(), 1, 2, 3);
|
||||
putch(10);
|
||||
n = n - 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -0,0 +1 @@
|
||||
29
|
@ -0,0 +1,8 @@
|
||||
float a,b;
|
||||
|
||||
int main(){
|
||||
a=10.2;
|
||||
b=5.3;
|
||||
float c=a*2+b*1.1+3.6;
|
||||
return c;
|
||||
}
|
@ -0,0 +1 @@
|
||||
0
|
@ -0,0 +1,5 @@
|
||||
float a[2] = {1.2, 1.3};
|
||||
int main(){
|
||||
a[1] = 3.3;
|
||||
return 0;
|
||||
}
|
@ -0,0 +1 @@
|
||||
4
|
@ -0,0 +1,6 @@
|
||||
const int x=4;
|
||||
|
||||
int main(){
|
||||
const int x=4;
|
||||
return x;
|
||||
}
|
@ -0,0 +1 @@
|
||||
9
|
@ -0,0 +1,7 @@
|
||||
const float a[5]={0.2,1.33,2.4,3.5,4.6};
|
||||
const int b = 3;
|
||||
float c = a[b + 1];
|
||||
|
||||
int main(){
|
||||
return a[4] + c;
|
||||
}
|
@ -0,0 +1 @@
|
||||
6
|
@ -0,0 +1,13 @@
|
||||
float a,b,c;
|
||||
|
||||
void add(float a,float b){
|
||||
c=a+b;
|
||||
return;
|
||||
}
|
||||
|
||||
int main(){
|
||||
a=3.3;
|
||||
b=2.8;
|
||||
add(a,b);
|
||||
return c;
|
||||
}
|
@ -0,0 +1 @@
|
||||
0
|
@ -0,0 +1,15 @@
|
||||
int a;
|
||||
int main(){
|
||||
a = -10;
|
||||
if( a>0 ){
|
||||
return 1;
|
||||
}
|
||||
else{
|
||||
if(a > -5) {
|
||||
return 2;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
60
|
@ -0,0 +1,21 @@
|
||||
int a;
|
||||
int b;
|
||||
int main(){
|
||||
b=0;
|
||||
a=3;
|
||||
int sum = 0;
|
||||
while(b<10){
|
||||
b = b+1;
|
||||
while(a > 0) {
|
||||
a = a-1;
|
||||
sum = sum + b;
|
||||
}
|
||||
sum = sum + b;
|
||||
}
|
||||
|
||||
while(b < 12) {
|
||||
sum = sum + 1;
|
||||
b = b+1;
|
||||
}
|
||||
return sum;
|
||||
}
|
@ -0,0 +1 @@
|
||||
3 2
|
@ -0,0 +1 @@
|
||||
4
|
@ -0,0 +1,22 @@
|
||||
int a;
|
||||
int b;
|
||||
int main(){
|
||||
a = getint();
|
||||
b = getint();
|
||||
if ( a == b ){
|
||||
return 1;
|
||||
}
|
||||
if ( a <= b ){
|
||||
return 2;
|
||||
}
|
||||
if ( a < b ){
|
||||
return 3;
|
||||
}
|
||||
if ( a != b){
|
||||
return 4;
|
||||
}
|
||||
if ( a >= b){
|
||||
return 5;
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -0,0 +1 @@
|
||||
0
|
@ -0,0 +1,7 @@
|
||||
int a[5][2] = {1,{2,3},{4},{5,6,7}};
|
||||
int b[5][2] = {{1,0},{2,3},{4,0},{5,6},{7,0}};
|
||||
int main(){
|
||||
int i = a[3][1];
|
||||
int j = b[3][1];
|
||||
return (i-j);
|
||||
}
|
@ -0,0 +1 @@
|
||||
0
|
@ -0,0 +1,7 @@
|
||||
int main(){
|
||||
int a[5][2] = {1,{2,3},{4},{5,6,7}};
|
||||
int b[5][2] = {{1,0},{2,3},{4,0},{5,6},{7,0}};
|
||||
int i = a[3][1];
|
||||
int j = b[3][1];
|
||||
return i - j;
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
@ -0,0 +1,329 @@
|
||||
#ifndef _SYSYF_SYNTAX_TREE_H_
|
||||
#define _SYSYF_SYNTAX_TREE_H_
|
||||
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
#include "location.hh"
|
||||
#include "internal_types.h"
|
||||
|
||||
namespace SysYF
|
||||
{
|
||||
namespace SyntaxTree
|
||||
{
|
||||
|
||||
using Position = yy::location;
|
||||
|
||||
// Enumerations
|
||||
enum class Type
|
||||
{
|
||||
INT = 0,
|
||||
VOID,
|
||||
STRING,
|
||||
BOOL,
|
||||
FLOAT
|
||||
};
|
||||
|
||||
enum class BinOp
|
||||
{
|
||||
PLUS = 0,
|
||||
MINUS,
|
||||
MULTIPLY,
|
||||
DIVIDE,
|
||||
MODULO
|
||||
};
|
||||
|
||||
enum class UnaryOp
|
||||
{
|
||||
PLUS = 0,
|
||||
MINUS
|
||||
};
|
||||
|
||||
enum class UnaryCondOp
|
||||
{
|
||||
NOT = 0
|
||||
};
|
||||
|
||||
enum class BinaryCondOp
|
||||
{
|
||||
LT = 0,
|
||||
LTE,
|
||||
GT,
|
||||
GTE,
|
||||
EQ,
|
||||
NEQ,
|
||||
LAND,
|
||||
LOR
|
||||
};
|
||||
|
||||
// Forward declaration
|
||||
struct Node;
|
||||
struct Assembly;
|
||||
struct GlobalDef;
|
||||
struct FuncDef;
|
||||
|
||||
struct Expr;
|
||||
struct CondExpr;
|
||||
struct AddExpr;
|
||||
struct BinaryExpr;
|
||||
struct BinaryCondExpr;
|
||||
struct UnaryCondExpr;
|
||||
struct UnaryExpr;
|
||||
struct LVal;
|
||||
struct Literal;
|
||||
|
||||
struct Stmt;
|
||||
struct VarDef;
|
||||
struct AssignStmt;
|
||||
struct FuncCallStmt;
|
||||
struct ReturnStmt;
|
||||
struct BlockStmt;
|
||||
struct EmptyStmt;
|
||||
struct ExprStmt;
|
||||
|
||||
struct FuncParam;
|
||||
struct FuncFParamList;
|
||||
|
||||
struct IfStmt;
|
||||
struct WhileStmt;
|
||||
struct BreakStmt;
|
||||
struct ContinueStmt;
|
||||
struct InitVal;
|
||||
|
||||
class Visitor;
|
||||
|
||||
// Virtual base of all kinds of syntax tree nodes.
|
||||
struct Node
|
||||
{
|
||||
Position loc;
|
||||
// Used in Visitor. Irrelevant to syntax tree generation.
|
||||
virtual void accept(Visitor &visitor) = 0;
|
||||
};
|
||||
|
||||
//node for initial value
|
||||
struct InitVal: Node{
|
||||
bool isExp;
|
||||
PtrVec<InitVal> elementList;
|
||||
Ptr<Expr> expr;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
// Root node of an ordinary syntax tree.
|
||||
struct Assembly : Node
|
||||
{
|
||||
PtrVec<GlobalDef> global_defs;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
// Virtual base of global definitions, function or variable one.
|
||||
struct GlobalDef : virtual Node
|
||||
{
|
||||
void accept(Visitor &visitor) override = 0;
|
||||
};
|
||||
|
||||
// Function definition.
|
||||
struct FuncDef : GlobalDef
|
||||
{
|
||||
Type ret_type;
|
||||
Ptr<FuncFParamList> param_list;
|
||||
std::string name;
|
||||
Ptr<BlockStmt> body;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
// Virtual base for statements.
|
||||
struct Stmt : virtual Node
|
||||
{
|
||||
void accept(Visitor &visitor) override = 0;
|
||||
};
|
||||
|
||||
// Variable definition. Multiple of this would be both a statement and a global definition; however, itself only
|
||||
// represents a single variable definition.
|
||||
struct VarDef : Stmt, GlobalDef
|
||||
{
|
||||
bool is_constant;
|
||||
Type btype;
|
||||
std::string name;
|
||||
bool is_inited; // This is used to verify `{}`
|
||||
PtrVec<Expr> array_length; // empty for non-array variables
|
||||
Ptr<InitVal> initializers;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
// Assignment statement.
|
||||
struct AssignStmt : Stmt
|
||||
{
|
||||
Ptr<LVal> target;
|
||||
Ptr<Expr> value;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
// Return statement.
|
||||
struct ReturnStmt : Stmt
|
||||
{
|
||||
Ptr<Expr> ret; // nullptr for void return
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
// BlockStmt statement.
|
||||
struct BlockStmt : Stmt
|
||||
{
|
||||
PtrVec<Stmt> body;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
// Empty statement (aka a single ';').
|
||||
struct EmptyStmt : Stmt
|
||||
{
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
struct ExprStmt : Stmt
|
||||
{
|
||||
Ptr<Expr> exp;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
// Virtual base of expressions.
|
||||
struct Expr : Node
|
||||
{
|
||||
void accept(Visitor &visitor) override = 0;
|
||||
};
|
||||
|
||||
struct CondExpr : Expr
|
||||
{
|
||||
void accept(Visitor &visitor) override = 0;
|
||||
};
|
||||
|
||||
struct AddExpr : Expr
|
||||
{
|
||||
void accept(Visitor &visitor) override = 0;
|
||||
};
|
||||
|
||||
|
||||
struct UnaryCondExpr : CondExpr{
|
||||
UnaryCondOp op;
|
||||
Ptr<Expr> rhs;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
struct BinaryCondExpr : CondExpr{
|
||||
BinaryCondOp op;
|
||||
Ptr<Expr> lhs,rhs;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
// Expression like `lhs op rhs`.
|
||||
struct BinaryExpr : AddExpr
|
||||
{
|
||||
BinOp op;
|
||||
Ptr<Expr> lhs, rhs;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
// Expression like `op rhs`.
|
||||
struct UnaryExpr : AddExpr
|
||||
{
|
||||
UnaryOp op;
|
||||
Ptr<Expr> rhs;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
// Expression like `ident` or `ident[exp]`.
|
||||
struct LVal : AddExpr
|
||||
{
|
||||
std::string name;
|
||||
PtrVec<Expr> array_index; // nullptr if not indexed as array
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
// Expression constructed by a literal number.
|
||||
struct Literal : AddExpr
|
||||
{
|
||||
Type literal_type;
|
||||
int int_const;
|
||||
// std::string str;
|
||||
double float_const;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
// Function call statement.
|
||||
struct FuncCallStmt : AddExpr
|
||||
{
|
||||
std::string name;
|
||||
PtrVec<Expr> params;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
struct FuncParam : Node
|
||||
{
|
||||
std::string name;
|
||||
Type param_type;
|
||||
PtrVec<Expr> array_index; // nullptr if not indexed as array
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
struct FuncFParamList : Node
|
||||
{
|
||||
PtrVec<FuncParam> params;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
struct IfStmt : Stmt
|
||||
{
|
||||
Ptr<Expr> cond_exp;
|
||||
Ptr<Stmt> if_statement;
|
||||
Ptr<Stmt> else_statement;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
struct WhileStmt : Stmt
|
||||
{
|
||||
Ptr<Expr> cond_exp;
|
||||
Ptr<Stmt> statement;
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
struct BreakStmt : Stmt
|
||||
{
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
struct ContinueStmt : Stmt
|
||||
{
|
||||
void accept(Visitor &visitor) final;
|
||||
};
|
||||
|
||||
// Visitor base type
|
||||
class Visitor
|
||||
{
|
||||
public:
|
||||
virtual void visit(Assembly &node) = 0;
|
||||
virtual void visit(FuncDef &node) = 0;
|
||||
virtual void visit(BinaryExpr &node) = 0;
|
||||
virtual void visit(UnaryExpr &node) = 0;
|
||||
virtual void visit(LVal &node) = 0;
|
||||
virtual void visit(Literal &node) = 0;
|
||||
virtual void visit(ReturnStmt &node) = 0;
|
||||
virtual void visit(VarDef &node) = 0;
|
||||
virtual void visit(AssignStmt &node) = 0;
|
||||
virtual void visit(FuncCallStmt &node) = 0;
|
||||
virtual void visit(BlockStmt &node) = 0;
|
||||
virtual void visit(EmptyStmt &node) = 0;
|
||||
virtual void visit(ExprStmt &node) = 0;
|
||||
virtual void visit(FuncParam &node) = 0;
|
||||
virtual void visit(FuncFParamList &node) = 0;
|
||||
virtual void visit(IfStmt &node) = 0;
|
||||
virtual void visit(WhileStmt &node) = 0;
|
||||
virtual void visit(BreakStmt &node) = 0;
|
||||
virtual void visit(ContinueStmt &node) = 0;
|
||||
virtual void visit(UnaryCondExpr &node) = 0;
|
||||
virtual void visit(BinaryCondExpr &node) = 0;
|
||||
virtual void visit(InitVal &node) = 0;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif // _SYSYF_SYNTAX_TREE_H_
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue