Files
TransPyC/pt
2026-06-16 16:09:42 +08:00

121 lines
6.3 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
用Python做一个适用于 自制操作系统 的 编译器用于实现Python转C使用ast抽象语法树的解析转换文件内容C到Python用pycparser
需要达到一下要求:
1.不需要支持第三方或自带的模块
2.需要支持全部内部的定义方法包括关键字比如if for while break continue等语句判断需要支持and or not is == != >= <= > < 等。
3.需要支持乘法、除法加法减法和异或计算。
3.True 和 False 通过定义宏1/0实现。
4.class转换比较复杂(支持面向对象)而且不能使用任何库转换为C的类内常量和类外函数Python通过映射表映射到函数上。
5.你需要书写c.py和t.py如果有导入xxx的库名为c或t直接忽略这是py2c的内部语义库。
其它所有import xxx或from xxx import xxx统一都翻译为#include xxx
注意不能忽略只有c和t可以忽略其它的都要翻译为#include xxx并且注释上原语句在再次Python化时就可以直接套用原语句了
6.import 只需要 include对应的文件import的文件应该已经一起被翻译成c或h了
从别的模块导入的函数需要去掉模块名称而且要加上namespce处理注意代码缩进。
7.注意函数调用和结构体实例化的实现还有value和key不准变成None。
8.请你实现并且注意C的极端小众的表达并想好如何在Python中语义化表达比如asmrange简化class简化typedef 和其后缀指针操作define宏。
9.有一些C中的极端语句Python无法语义化比如asm指针操作等指令。
提供一个扩展库c.pyipy2c在转化时直接忽略import c等相关语句将c.*比如c.asm("""""", *args, ...)直接转为C asm具体语义
比如 asm volatile (
"movb $0x0e, %%ah\n"
"int $0x10\n"
: : "a"(c)
);这种语句和类似特殊语句的实现
10.支持双向转换py->cc->py对于不知道含义的函数就当没看见就好了直接按照通用语义转换。
11.支持内存地址硬编码赋值等c.py
12.强制类型转换赋值
13.区分class xxx()和class xxx(c.class_point),普通结构体和结构体指针
14.支持结构体成员嵌套访问
15.支持结构体数组+指针索引访问实现结构体数组的Python语义映射l: c.class_list = []
16.static 关键字支持i: t.Static | t.CInt
17.支持栈指针直接操作ESP语义映射
18.支持宏常量强制类型转换依赖c.py
19.支持高级位运算和多层嵌套逻辑或位运算组合
20.对于#define宏使用t.CDefinet.CType作为类型表示
21.对于仅声明暂不定义的量用xxx: xxx = c.State
22.对于Python的函数要求其返回值和参数必须注解def example(e1: t.CType) -> t.CType: xxx
这样才能正确转换为C函数比如def xxx(e1: t.CChar) -> t.CInt: xxx转为int xxx(char e1) {xxx}。
若函数无返回值,可以写 def xxx(e1: t.CChar) -> None: xxx或def xxx(e1: t.CChar) -> t.CVoid: xxx 或不进行注解
对于语法需要写在c.py。
对于类型需要写在t.py比如c_int、c_char等而不是直接写int不然会出现冲突。
c.py和t.py的定义都需要写元数据以及语法定义通过元数据和元函数来实现具体的语法定义以便于扩展比如
class CInt(t.CType):
def __init__(self):
self.CName = 'int'
super().__init__()
def ...
23.对于C->Py和Py->C的翻译更多地通过c.py和t.py中t.CType和c.CGrammar来实现也就是在通过ast或pycparser解析后
如果可以的话把数据类型交给t.CType委托处理语法给c.CGrammar委托处理而不是硬编码在Py2C主程序中。
24.禁止使用硬编码来偷懒!
对于需要多个类型的情况,比如 static char *str = "hello";
在 Python 中仅需定义 str: t.CStatic | t.Char | t.Ptr = "hello";
无需定义 t.CStaticCharPtr 这种复杂的类型,直接用 t.CStatic | t.Char | t.Ptr 即可。
允许使用元函数修改多种类型的组合方式,比如
class CStatic(t.CType):
def __init__(self):
self.CName = 'static char *'
super().__init__()
def __merge__(self, types: list):
# 此处 types 为多个父为 t.Ctypes比如 [t.CStatic, t.Char, t.Ptr]
# 在此处我需要返回我修改后的 types比如假设我与 t.Ptr 冲突(实际上并不冲突,只是作示例),那就返回 [t.CStatic, t.Char]
if t.Ptr in types:
types.remove(t.Ptr)
return types
以此类推,支持更多种类型。
你需要默认支持的类型:
char
int
short
long
float
double
void
unsigned char
unsigned int
unsigned short
unsigned long
signed char
struct
union
enum
typedef
auto
register
static
extern
const
volatile
size_t
int8_t
int16_t
int32_t
int64_t
uint8_t
uint16_t
uint32_t
uint64_t
intptr_t
uintptr_t
ptrdiff_t
wchar_t
char16_t
char32_t
bool
_Complex
_Imaginary
注意转换后的python或c需要符合其语法规范不能有语法错误。
还有就是C中的所有函数都请你当作普通函数定义在其它h文件也就是不需要考虑函数的定义和实现。
如果有-wh参数后面会带着几个h文件也就是这些函数的定义你可以进行参考如果没有就算了按默认方法处理。
代码格式要求:所有命名都使用帕斯卡命名法,首字母大写,缩写大写,不需要注释,最简代码,但人类可读。
你可以写一个入口程序,再写多个小库在./lib中来降低复杂度./lib文件夹已创建无需检查。
禁止使用硬编码偷懒!
执行方法:
python TransPyC.py -f test.py -o test.c
python TransPyC.py -f test.c -o test2.py -wh test.h
仅需一个Python文件
然后你需要尝试将test.c转为test.py并验证是否正确再将test.py转为test2.c并验证是否和test.c语义相同。
test.c已存在这是一个略微复杂的操作系统C程序需要你进行完整转换。
我已经给了你example_test.py作为目标转换结果的参考。
中文输出