Вам потребуется установить WSL
. Для этого нужно следовать инструкции.
Обратите внимание что нужно выбрать версию Ubuntu18
После установки запускаем Ubuntu 18.04 LTS
у вас должен появиться терминал
Пользователям linux можно приступать к следующему шагу
Находясь в терминале установите следующие зависимости:
sudo apt install git cmake
Создайте папку для работы с курсом и перейдите в нее
mkdir ~/compiler-course && cd ~/compiler-course
Далее собираем LLVM
вместе с Clang
из исходников
git clone https://github.com/llvm/llvm-project
cd llvm-project/llvm/
mkdir build && cd build
cmake ../ -DCMAKE_INSTALL_PREFIX=install \
-DLLVM_TARGETS_TO_BUILD=X86 \
-DLLVM_ENABLE_PROJECTS=clang
make -j4
make install
Сборка может занять длительное время
Вы также можете использовать уже собранный llvm & clang, для того что бы получить последнюю версию:
- Перейдите в папку с задачей.
- Запустите:
source download-and-install-llvm.sh
Скрипт скачает последний релиз и положит его в папку/tmp/
, также выставит переменнуюLLVM_DIR
, поэтому вам больше не нужно ее выставлять во время запуска. - Перейдите в папку с билдом и запустите:
cmake ../
make -j8
Обратите внимание, что сборка LLVM из исходников потребуется для сдачи дальнейших задач в курсе. Данный workraround
поможет сдать только текущую задачу.
После успешного построения LLVM & Clang
можно приступать к выполнению задания.
Вернитесь в корневую папку курса:
cd ~/compiler-course
Для начала сделайте Fork текущего репозитория к себе в профиль. После этого копия репозитория появится у вас в профиле.
Склонируйте и перейдите в локальную копию:
git clone <fork-repo-url>
cd UNN-C-Style-Checker/
Создайте отдельную ветку для работы с репозиторием, которая будет содержать имя, фамилию и направление, пример:
git checkout -b vasya-pupkin-fiit
Собираем проект с заданием
mkdir build && cd build
cmake ../ -DLLVM_DIR=~/compiler-course/workspace/llvm-project/llvm/build/install/lib/cmake/llvm
make -j8
В задаче нужно реализовать с помощью интерфейса clang, tool
, который будет находить в исходном коде программы все приведения типов в стиле си и заменять их на соответсвующий аналог из с++
Пример:
double d = 4.5
int i = (int)d; // int i = static_cast<int>(d);
Для замены исходного кода программы будем пользоваться классом Rewriter
Вам нужно будет дописать код в класс CastCallBack
, который отвечает за действие, которое нужно совершить при нахождении узла cStyleCastExpr
в AST
. В данном случае мы хотим понять тип преобразования и заменить исходный код с помощью Rewriter
.
class CastCallBack : public MatchFinder::MatchCallback {
public:
CastCallBack(Rewriter& rewriter) {
// Your code goes here
};
virtual void run(const MatchFinder::MatchResult &Result) {
// Your code goes here
}
}
Подробнее о том как достать всю необходимую информацию из MatchFinder::MatchResult
можно посмотреть в файле tool.cpp.
После того как вы реализуете CastCallBack
, пересоберите проект и запустите.
./c-style-checker ../test/test.cpp --extra-arg=-I/home/<your-root-name>/compiler-course/llvm-project/llvm/build/lib/clang/<version>include/
Если вы все реализовали правильно, то вы увидите на экране
#include <iostream>
int main() {
float f;
int i = static_cast<int>(f);
return 0;
}
После того как вы сделали заданиe:
- Сделайте коммит:
git add -u git commit -m 'Complete c-style-checker task'
- Отправьте ветку с вашим решением на сервер:
git push origin HEAD
- Перейдите на github и откройте
pull request
из вашей ветки вmaster
главного репозитория
Если необходимо что то исправить после создания pull request
нужно просто сделать изменения и повторить шаги 1 и 2.
Не нужно открывать новый pull request