Compare commits

...

2 Commits

@ -0,0 +1,36 @@
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 -Werror -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
)

@ -1,7 +1,7 @@
# PW6 实验报告
PB21000117 陈应豪
PB21111663 李璐豪
## 问题回答
### task1
@ -29,6 +29,12 @@ PB21000117 陈应豪
## 实验设计
在task1的时候学习SysYF的语法并编写等效的ll文件
在task2的时候学习能够生成SysYF的IR文法使之能生成等效的ll文件
在task3的时候利用实验框架通过类比上一关的IR认罚的编写利用已经生成的AST树为不同的模块编写对应的IR语法
- 在task1的时候学习SysYF的语法并编写等效的ll文件
- 在task2的时候学习能够生成SysYF的IR文法使之能生成等效的ll文件
@ -38,6 +44,10 @@ PB21000117 陈应豪
## 实验难点及解决方案
在函数外表达式的计算中由于全局变量无法使用bb模块内的build相关函数需要根据变量名单独取出值并计算
Const数组不会在函数外进行再赋值的操作
- 全局变量在初始化时如果用到其他全局变量进行赋初值无法使用builder->create_load()
- 获取全局数组中元素的值比较麻烦
@ -55,5 +65,3 @@ PB21000117 陈应豪
配置文件不够齐全
## 组间交流
我们一起预约研讨室线下写代码

@ -34,7 +34,7 @@ namespace SysYF
Ptr<Type> FLOAT_T;
Ptr<Type> INT32PTR_T;
Ptr<Type> FLOATPTR_T;
int if_BB_num = 0;
int while_BB_num = 0;
#define get_true_type(left_type, right) \
@ -806,21 +806,42 @@ namespace SysYF
case SyntaxTree::BinOp::DIVIDE:
if (expr_type == INT32_T)
{
tmp_val = CONST_INT(lhs_int / rhs_int);
if(rhs_int == 0){
cout << "Wrong Number" << endl;
}
else{
tmp_val = CONST_INT(lhs_int / rhs_int);
}
}
else
{
tmp_val = CONST_FLOAT(lhs_float / rhs_float);
if(rhs_float == 0){
cout << "Wrong Number" << endl;
}
else{
tmp_val = CONST_FLOAT(lhs_float / rhs_float);
}
}
break;
case SyntaxTree::BinOp::MODULO:
if (expr_type == INT32_T)
{
tmp_val = CONST_INT(lhs_int % rhs_int);
if(rhs_int == 0){
cout << "Wrong Number" << endl;
}
else{
tmp_val = CONST_INT(lhs_int % rhs_int);
}
}
else
{
tmp_val = CONST_INT(static_cast<int>(lhs_float) % static_cast<int>(rhs_float));
if(rhs_float == 0){
cout << "Wrong Number" << endl;
}
else{
tmp_val = CONST_INT(static_cast<int>(lhs_float) % static_cast<int>(rhs_float));
}
}
break;
}

Loading…
Cancel
Save