Skip to content

Navigation Menu

Sign in
Sign up

Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

pycc

Компилятор 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 <файл> Как использовать? Два варианта:
  1. Перетащить библиотеки в папку libc
  2. Перед использованием написать эту строку:
    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/

About

Компилятор C на Python

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /