Компилятор C на Python, реализованный примерно в 724 строчек кода.
Вот правила которые есть:
-
Типы данных int и char (второй мне кажется багованный)
-
Куча циклов: do-while, while
-
Условие if-else
-
Функции только с помощью void
-
Если к char добавить строку "hello world" то сделайте с помощью переменных
-
Эти операторы: +, -, /, *, <, >, ==, !=
-
Присваивание переменных (имя = значение;)
-
Декларация с инициализацией (тип_данных имя = значение;)
-
Небольшой препроцессор (см. Взаимодействия с препроцессором)
Пример кода:
void fac(n) {
int f = 1;
while (n > 1) {
f = f * n;
n = n - 1;
}
}
void main() {
fac(5);
}Использовать легко.
Копируйте папку "pycc" (которая в этом репозитории а не папка репозитория) в рабочую папку.
В файле где идёт работа с pycc пишите эту строку:
from pycc import *Чтобы запустить код на C используйте функцию run_c. К примеру:
from pycc import *
run_c('''
void printf(mes) {
stdout = stdout + mes;
}
void main() {
printf("'hello, world!'");
}''')Если вы хотите запустить файл то пишете в командую строку:
python.exe pycc имя_файла
Функция вывода (printf):
void printf(mes) {
stdout = stdout + mes;
}Функция просить строку из пайтона чтобы потом виртуальная машина выполнила сообщение из mes. Ну и остальное stdout.
Функция факториала:
void fac(n) {
int f = 1;
while (n > 1) {
f = f * n;
n = n - 1;
}
}В конец можно добавить строку stdout = stdout + "f"; чтобы выводить результат вычисления факториала.
Также можно реализовать Фибоначчи и много других функций. Но пока кроме printf, факториала и всех этих декрементов и инкрементов больше не нашел применения.
В моём компиляторе есть препроцессор. Вот директивы на данный момент:
- #include <файл> Как использовать? Два варианта:
- Перетащить библиотеки в папку libc
- Перед использованием написать эту строку:
from pycc import # flag = 'путь/к/папке/с/библиотеками' #вот эта строка
Также библиотеки которые присутствуют:
- stdio.h: функции ввода-вывода, функции: printf("строка_из_пайтона"); Пример кода с препроцессором:
#include <stdio.h>
void main() {
printf("'hello world'");
}В этом заголовке я объясню синтатикс этого компилятора ещё больше.
Начнём с if-else. Вот пример (как работает):
if (условие) {
//блок кода
}
//если else нужен
else {
//блок кода
}Как вы заметили комментарии здесь тоже есть.
Вот полный пример:
void main() {
int x = 5;
if (x < 10) {
x = 10;
}
else {
x = 5;
}
}Создаём переменную x. И проверяем: меньше 10? Тогда будет 10. Больше десяти или 10? Будет 5.
Всё легко. Да.
Теперь do-while. Вот пример работы:
do {
//блок кода
} while (условие);Пример:
void main() {
int a = 5;
do {
a = a - 1
} while (a > 6);
}Я специально сделал условие со значением false.
Но "a" будет не 5 а 4.
В этом весь смысл do-while.
Я думаю while можно не объяснять ведь я его показывал ранее.
Пример Фибоначчи 10:
//сама функция фибоначчи
void fib(n) {
int n1 = 1;
int n2 = 1;
int n3 = 1;
int count = n - 2;
while (count) {
n3 = n1 + n2;
n1 = n2;
n2 = n3;
count = count - 1;
}
}
//функция вывода
void printf(mes) {
stdout = stdout + mes;
}
//все эти вызовы
void main() {
fib(10);
printf("'fibonacci of 10: '+str(n2)");
}Вот так. И всё равно главное в этом примере это while.
А вывод:
fibonacci of 10: 55
Вот так вот. В принципе я всё показал.
Функция lex из папки lexer где в файле lexer.py - https://habr.com/ru/articles/206320/
Циклы и условие if-else для компилятора - https://habr.com/ru/articles/133780/