# cnc **Repository Path**: freeonsky/cnc ## Basic Information - **Project Name**: cnc - **Description**: c next 语言 - **Primary Language**: C++ - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-27 - **Last Updated**: 2025-12-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CNC (C Next) - 面向对象的C语言扩展编译器 ## 介绍 CNC (C Next) 是一个扩展的C语言,为C语言添加了结构体方法绑定功能。它允许您在结构体类型上定义方法,使代码更加面向对象和模块化。CNC v1版本增强了指针方法的返回值支持,显著增强了语言的表现力。 ## 功能特性 - ✅ 结构体方法绑定 - ✅ 值方法和指针方法 - ✅ 方法参数支持 - ✅ 指针方法返回值(v1新功能) - ✅ 自动生成C函数 - ✅ 方法调用转换 - ✅ 头文件生成 - ✅ 动态内存管理(自动包含stdlib.h) ## 软件架构 CNC编译器采用模块化设计,主要包含以下几个组件: - **Lexer**:词法分析器,负责将源代码转换为词法单元 - **Parser**:语法分析器,负责解析impl块和方法定义 - **CodeGenerator**:代码生成器,负责生成C函数和头文件 - **CNextCompiler**:主编译器类,协调整个编译流程 ## 安装教程 1. 确保系统已安装C++17兼容的编译器(如g++) 2. 克隆项目到本地:`git clone ` 3. 进入项目目录:`cd cnc` 4. 编译编译器:`g++ -std=c++17 -O2 main.cpp -o cnc` ## 使用说明 1. 编写CNC源代码文件(以.cn为扩展名) 2. 使用编译器编译:`./cnc input.cn -o output.c -h` 3. 编译生成的C文件:`gcc -o output output.c -lm`(根据需要添加其他库) 4. 运行程序:`./output` ### 编译参数说明 - `input.cn`: CNC源代码文件 - `-o output.c`: 指定输出C文件 - `-h`: 生成对应的头文件 ## 语法示例 ### 基本用法 ```c #include #include typedef struct { int x; int y; } Point; impl Point { // 值方法:计算距离原点距离 float norm() { return sqrt(self.x * self.x + self.y * self.y); } // 指针方法:平移点(无返回值) *void translate(int dx, int dy) { self->x += dx; self->y += dy; } // 指针方法:创建副本(返回指针) *Point createCopy() { return (Point){self->x, self->y}; } } int main() { Point p = {3, 4}; Point *pp = &p; printf("距离原点: %f\n", p.norm()); pp->translate(3, 4); Point *copy = pp->createCopy(); return 0; } ``` ### 指针方法返回值示例(CNC v1新特性) ```c #include #include typedef struct { int x; int y; } Point; impl Point { // 指针方法:创建副本(返回指针) *Point createCopy() { return (Point){self->x, self->y}; } // 指针方法:计算与另一个点的距离(返回数值) *float distanceTo(Point other) { int dx = self->x - other.x; int dy = self->y - other.y; return sqrt(dx*dx + dy*dy); } // 指针方法:获取当前点坐标(返回指针) *Point getPoint() { return (Point){self->x, self->y}; } } int main() { Point p = {3, 4}; Point *pp = &p; // 测试指针方法返回指针 Point *copy = pp->createCopy(); printf("副本坐标: (%d, %d)\n", copy->x, copy->y); // 测试指针方法返回数值 Point other = {6, 8}; float dist = pp->distanceTo(other); printf("到点的距离: %f\n", dist); // 测试指针方法返回指针 Point *current = pp->getPoint(); printf("当前坐标: (%d, %d)\n", current->x, current->y); return 0; } ``` ## 限制和注意事项 1. 方法名必须是有效的C标识符 2. 指针方法需要使用 `self->` 访问成员 3. 值方法需要使用 `self.` 访问成员 4. 指针方法标记 `*` 必须紧跟在方法名前 5. 返回值类型必须与方法实现中的return语句匹配 ## 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request ## 许可证 本项目采用 LICENSE 文件中指定的许可证进行许可。