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