news 2026/10/19 3:58:27

从零搭建轻量CRM:解决中小团队客户管理与跟进记录难题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零搭建轻量CRM:解决中小团队客户管理与跟进记录难题

不管你是刚接手销售团队的管理者,还是被各种客户表格折磨到崩溃的运营,应该都经历过这样的场景:重要客户的聊天记录散落在不同人的微信里,报价单躺在各自的电脑桌面,每个人心里都觉得“这个客户我清楚”,可真到了交接或复盘的时候,没人能拿出一份完整的客户档案。我要聊的DeskcommCRM,就是为解决这类问题而搭建的一套轻量客户管理系统。它没有传统大厂CRM那样的复杂功能,核心就是把“客户资料”和“沟通记录”这两件事做到极致。适合正在用表格管客户、但又明显感觉表格不够用的中小团队。下面我把这个项目的完整思路、功能拆解、技术落地和踩坑记录一次讲透,争取让想上手的人看完就能有个清晰的搭建方向。

1. 先搞清楚DeskcommCRM到底解决什么问题

1.1 客户资料割裂,是中小团队的第一大痛点

先说一个很多人都经历过的场景:销售A加了客户的采购负责人微信,断断续续聊了三个月,对方已经松口说要签合同,结果销售A临时离职,客户交接给销售B,销售B打开交接文档一看,只有一句“客户有意向”和一张名片照片,连具体对接人姓什么都不全。这个局面几乎是中小团队的标配。

再比如,客服那边已经收到同一个客户三次产品报修,但销售人员依然在跟客户推销延保服务,两边完全不知道对方和客户沟通过什么。老板想要一个简单的客户盘点,运营就得从五个Excel表格里手动合并,每次合并都能发现同一家公司被录了三四遍,名称还不一样,有的叫“某某科技有限公司”,有的叫“某某科技公司”。

DeskcommCRM在设计时第一个要解决的就是这个“信息割裂”。它有一条硬性规则:一个企业客户只建立一个档案,所有联系人、沟通记录、报价、订单都挂在这个档案下面。这样做的好处是,不管谁接手这个客户,打开页面就能看到完整的历史。客户数量不是中小团队的核心问题,客户信息的一致性和连续性才是。系统要做的,就是把这些散落的信息统一收口,变成一份每个成员都能在权限范围内看到的标准档案。

1.2 为什么叫Deskcomm:工位上的沟通工作台

很多人第一次听到DeskcommCRM会问,这名字是什么意思?其实拆开看就清楚了:Desk是工位,Comm是沟通。合起来就是“工位上的沟通工作台”。

这个命名不是随便起的,它直接决定了系统的定位。Desk,意味着这是一个给坐在电脑前办公的一线人员使用的系统,不是给老板看大屏展示的管理驾驶舱。Comm,意味着沟通记录是它最核心的数据资产。CRM系统有很多种玩法,有的强调销售过程管理,有的强调营销自动化,但DeskcommCRM从一开始就把“沟通留痕”作为第一优先级的业务主线。

这个定位也影响了后面一系列功能设计的侧重点。比如,录入通话记录必须尽量快,字段越少越好;跟进记录要支持键盘快速操作;客户的完整时间线必须一眼可以扫完。可以说,Deskcomm的目标不是让老板满意,而是让一线员工真的愿意每天打开它。

1.3 适合谁用,不适合谁用

我做完这个项目之后最大的体会是:CRM这种东西,不是功能越多越好,而是匹配度越高越好。DeskcommCRM最合适的团队画像大概是这几类:

  • 10到50人左右的销售和客服团队,之前主要靠Excel和微信管理客户;
  • B2B业务为主,一个客户往往对应多个联系人,决策周期长,需要反复跟进;
  • 客户总量在几千到几万这个层级,还不需要管复杂库存、生产和供应链;
  • 公司对客户归属有争议,经常出现互相抢单或者客户无人跟进的团队。

反过来,如果业务是纯C端零售,客户就是一个个个人消费者,没有企业维度的概念,那这套以客户档案为核心的系统就用不上。如果公司已经有多层级组织架构,需要复杂的审批流、预算控制、供应链协同,那这也不是DeskcommCRM要覆盖的范围,直接选重型产品更合适。

这里我列一个简单的适配判断表:

场景适配度说明
10-50人B2B销售团队高客户档案+跟进+订单闭环,正中需求
客服+售后团队高沟通时间线天然适合沉淀售后记录
纯线下零售门店低没有企业客户概念,用会员系统更合适
制造业复杂供应链低需要进销存和生产排期,已超出CRM范畴

想明白“边界在哪里”,比想明白“要做什么”更重要。这是我在设计DeskcommCRM时最先确定的判断。

2. 核心功能解构:每个模块为什么这么设计

2.1 客户信息管理:统一视图与反重复

客户信息管理是所有CRM的底座,但设计得不合理就会变成数据垃圾场。DeskcommCRM在客户建模上采用了两层结构:企业客户(Company)和联系人(Contact)。为什么要两层而不是单纯一张客户表?因为B2B业务里,你服务的对象是企业,但决策的却是企业里面一个个具体的人。供应商、采购负责人、财务对接人、技术对接人,可能都是不同的人,这些人需要归属到同一个企业客户名下面,才能形成全局视图。

在实践里,我遇到过团队把“联系人手机号”和“公司电话”挤在同一个字段里的情况,后来连他自己都分不清哪个是哪个。所以DeskcommCRM的联系方式字段改成了“类型+值”的结构,每种联系方式可以存多条,类型包括手机、微信、邮箱、办公电话、备用电话等。这样做虽然存储上不如单字段简单,但查询和显示都非常清晰。

反重复是另一个容易踩坑的地方。同一家客户被录两次,其实是Excel习惯的后遗症。DeskcommCRM的处理方式是:

  • 公司名称在保存时做归一化处理,统一大小写、全半角、去掉多余空格;
  • 企业邮箱和手机号作为唯一性判断条件,重复时提示是否合并;
  • 已经存在的联系人,新录入时会自动关联到已有客户档案。

这个方案不能做到100%防重复,但可以把重复率从“到处都是”降到“偶尔出现”。如果你正在规划自己的CRM,建议把反重复规则放在数据入口这一层,而不是事后靠人来排查。

2.2 跟进时间线:让每一次沟通都沉淀下来

跟进记录是DeskcommCRM的灵魂。最初的设计想得比较简单,就是一个文本框加一个保存按钮,结果上线后被一线业务员骂得很惨,说这跟写在记事本里有什么区别,还要额外登一次系统。后来我把跟进记录彻底改了结构,变成“动作+内容+下一步”三段式:

  • 动作:电话、微信、邮件、拜访、售后、转介绍,预设枚举值,不允许随便自由填入;
  • 内容:本次沟通的关键信息,限500字以内;
  • 下一步:关联一个日期,到时间自动提醒,可以指定负责人。

三条字段组合起来,一条记录就同时回答了“做了什么”“客户说了什么”“接下来要干什么”三个问题。时间线页面会把所有手填记录和系统行为混排在一起,比如“创建客户”“修改了联系人”“成交订单”“回款到账”都会自动出现在时间线上,这样任何一个人来看这个客户,都能在五分钟内了解全部历史。

有个细节值得单独拿出来说:跟进记录只允许追加,不允许修改和删除。如果你填错了,可以补一条“更正说明”,但原记录会一直保留。这个设计在一开始遭到很多人反对,觉得太死板,但半年后大家反而都认可了——它解决了销售跟进中最大的扯皮问题:谁说了什么,系统里留的是原始记录,谁也改不掉。这条规则相当于给团队上了一道保险。

2.3 订单与回款:轻量闭环不越界

做CRM的时候很容易贪多,把进销存、工单、财务全都塞进来,最后变成一个四不像。DeskcommCRM始终坚持的边界是:不做库存,不做物流,不做复杂财务,只把“报价—订单—回款”这条收入链路串起来。

订单模块我设计成了一个清晰的状态机:报价单、成交单、部分回款、已回款、已完成、已作废。每个订单可以关联多条回款记录,系统自动计算未回金额。做这张表时我最重视的是“回款日期”字段,很多销售跟进到客户口头承诺付款之后就松懈了,结果对方一拖再拖。DeskcommCRM的回款提醒就是针对这个场景设计的:账期内提前三天提醒,到期日还没收到款,则升级为红标提醒,并且自动通知直属主管。

这个模块不建议做得再重了。一旦把开票、税务、成本分摊加进来,系统的复杂度会指数级上升,维护成本和业务争议都会变得无法收拾。轻量闭环的价值在于,它让业务线的核心数据有据可查,同时不给运营增加额外负担。

2.4 数据看板:让管理者告别“手动报表”

以前做月度汇报,运营要先找销售人员挨个要数据,再手动算转化率,不仅慢,而且口径经常对不上。DeskcommCRM的数据看板直接从业务表实时聚合,完全不需要中间再经过人处理。

看板的核心指标是这几项:

  • 漏斗数据:线索数、有效客户数、成交客户数、回款额;
  • 人员维度:每个业务员的跟进次数、成交数、平均成交周期;
  • 客户维度:新客户数、流失客户数、待跟进客户数。

报表数据有一个硬性要求:明细可穿透。看板上任何一个数字,点进去都能看到对应的客户列表和记录列表,而不是一个孤零零的汇总数字。这样可以大大减少“那你这个数怎么算出来的”这类质疑,也让管理者可以把关注点从“数字对不对”转移到“下一步怎么干”上来。

3. 技术选型建议与落地架构要点

3.1 技术栈选择:好维护比高精尖更重要

再说说技术侧。很多项目一上来就规划微服务、容器编排、大数据,但对一个中小团队的CRM来说,这些往往都是给后期挖坑。DeskcommCRM在技术选型上有一条原则:优先团队成员最熟悉的技术,其次才是流行度。

我们的落地技术栈是这样一套组合:

  • 前端使用Vue 3加Element Plus,组件生态成熟,表格和表单的处理效率高;
  • 后端用Java Spring Boot,结构清晰,中小团队里的人多多少少都写过;
  • 数据库选PostgreSQL,没有选MySQL;
  • 对象存储用MinIO,用来放客户上传的附件和头像;
  • 部署用Docker Compose,一台4核8G的服务器足够支撑数千客户量的日常使用。

为什么数据库选了PostgreSQL而不是MySQL?最直接的原因是它对JSON字段的支持更好,Contact、自定义字段这类变长结构可以直接用JSONB存储,不用频繁改表结构。另外PostgreSQL自带的全文检索能力虽然不如专业搜索引擎,但应付“按公司名模糊搜索”“按备注关键词搜记录”这种诉求已经足够了,不必额外引入Elasticsearch。

单体应用还是坚持了下来。很多人会觉得微服务听起来更有扩展性,但对这套系统的真实访问量和数据规模来说,单体完全够用。开发部署都简单,排查问题也省事。项目刚开始跑的时候,复杂度永远只应该增长到“刚好能解决问题”的程度。

3.2 几个关键时刻的数据模型取舍

数据模型的设计直接决定后面改功能时的成本,这块我有几条实打实的经验。

第一,所有核心数据表默认软删除,也就是加一个deleted_at字段,删除操作只是标记而不是物理清除。这样做的理由是:误删客户是CRM里级别很高的事故,软删除至少给了恢复的余地。管理员在后台可以看到“回收站”,可以一键恢复。代价是查询时得多带条件,但这点成本完全可以接受。

第二,时间字段统一用UTC存储,前端展示时再按用户所在时区做本地化。这个一开始没人想得到,直到有客户出差到境外,发现系统里的跟进时间比实际差了12个小时,排查了半天最后发现是存储和展示混用了同一份数据。统一UTC到本地时区是最省心的做法。

第三,订单号的生成一定要加上随机位和唯一索引。我们的订单号规则是“业务前缀+年月日+4位随机字符”,看起来不复杂,但它能非常有效地避免并发情况下生成重复订单号的情况。数据库层面加的唯一索引是最后一道防线,就算业务代码里出现极端情况,数据库也能兜住。

第四,公司表对归一化后的名称建唯一索引,导入数据时用ON CONFLICT DO NOTHING。数据导入往往是系统刚上线时最容易出问题的地方,这个设计可以显著降低重复建档的几率。

3.3 权限模型:服务端把关,前端只做展示

权限设计得好不好,直接关系到数据安全和内部信任。DeskcommCRM把权限分成三个维度:角色、数据范围、字段级权限。

角色定义了几类人:系统管理员、部门主管、业务员、只读访客。数据范围上,管理员可以看全部客户,主管看本部门,普通业务员只看到自己名下和共享给自己的客户。字段级权限则更细,比如成本价、单笔回款金额、内部备注这类字段只给主管及以上角色开放,普通业务员不可见。

在做权限时我有一个很深的教训:前端隐藏入口只是提升体验,真正的权限判断必须落到服务端。接口层面要按登录用户的角色和数据范围来过滤数据,前端只是根据权限把按钮和字段隐藏掉。如果只做前端限制,会带来严重的越权风险;如果只做后端限制,用户又会看到一堆“点击之后告诉你没权限”的按钮,体验也很差。两件事各司其职才行。

另外,管理员每一次修改关键字段的操作都要记录操作日志,包括谁在什么时间改了哪个字段、旧值是什么、新值是什么。有了这个日志,遇到数据纠纷时才能快速定位,比双方各执一词要省心得多,这个功能建议所有自研CRM都带上。

4. 从散乱数据到全员上线的实操记录

4.1 上线前的准备:需求收敛与数据清洗

系统正式开发前,我们做的第一件事不是写代码,而是收集一线员工的“抱怨清单”。每个人的需求列表都拉得很长,什么自动阅卷、发票拍照识别、客户关系图谱,听上去都很有道理,但真要是全做,项目就永远走不到上线那一天。

需求收敛的办法很简单:按刚需、高频、低效三个维度打分,只做这三项排分最高的功能。第一个版本的功能一共就四大块:客户信息管理、跟进时间线、订单回款、数据看板。其他什么自动化营销、销售竞赛、在线客服全都不做。

真正麻烦的是数据清洗。团队原来用的Excel里,很多公司名是简称和全称混着来的,还有不少联系人没有手机号,只有微信号。我们对数据做了大扫除,凡是信息少于三个字段的客户,直接打回给对应的业务员确认。让我很意外的是,这个环节最大的阻力不是技术问题,而是部分业务员不愿意把自己手里的客户资料交出来——他们担心被公司“收走资源”。这个只能靠管理层面沟通解决,技术层面能做的只是在系统里给客户加上归属人权限,让业务员知道别人动不了他的客户。

4.2 数据迁移细节:编码、模板、归属匹配

数据迁移是最容易翻车的环节,别以为把Excel导进去就完事了。我复盘下来,有几个细节非常关键:

  • 导入模板一定要先设计好,字段名和系统完全一致,枚举值要求大小写都能自动匹配;
  • CSV导出统一用UTF-8编码,如果用默认编码导出的文件拿给Windows上的Excel打开,中文必现乱码,正确做法是另存为“UTF-8 with BOM”或者用专门的编辑器转换;
  • 导入时用手机号或企业邮箱匹配已存在的用户,自动把这些客户分配给对应的负责人,避免导入之后所有客户都没有归属人;
  • 数据一定要分批导入,每批控制在3000条以内,导入完成后查看错误日志,修复问题后再导下一批;
  • 全程保持“先备份,再导入”的习惯,数据库有完整快照,导入出问题随时可以回滚。

我记得第一轮导入时有大概两百多条数据因为手机号格式不标准失败,里面既有11位手机号,也有座机号带区号,还有一列写的是微信号。后来在导入前加了一步清洗程序,把手机号、座机号、微信号分别归到不同类型字段里,问题才算解决。

4.3 部署与备份:把运维成本压到最低

部署部分我坚持用Docker Compose,因为对中小团队来说,运维人的精力非常有限。整套系统拆成三个容器:前端静态资源、后端服务、数据库,再加一个Nginx做反向代理和HTTPS证书处理。类似下面的编排结构,具体版本号可根据实际镜像调整:

version: "3.8" services: db: image: postgres:15-alpine environment: POSTGRES_DB: deskcomm POSTGRES_USER: deskcomm POSTGRES_PASSWORD: change_me volumes: - pgdata:/var/lib/postgresql/data api: image: deskcomm/api:latest depends_on: - db environment: DB_DSN: host=db user=deskcomm password=change_me dbname=deskcomm ports: - "8080:8080" web: image: deskcomm/web:latest depends_on: - api ports: - "8081:80" volumes: pgdata:

备份这块一定要自动化。我配置了一个定时任务,每天凌晨3点执行数据库逻辑备份,备份文件保留30天,同时自动同步到对象存储和另一台内网机器。提一句:做了备份不等于备份可用,每月一定要做一次恢复演练,找个空库把备份还原一遍,确保整个链路通畅。

消息通知还要注意发件频率限制。初期我们用免费邮箱发通知,结果达到发件量上限之后,所有到期提醒都石沉大海。后来调整方案:通知默认走站内信,邮件只是辅助,并且对邮件发送做了频率控制和失败的自动重试。

5. 上线半年里踩过的坑,一次性讲清楚

5.1 “没人用”的难题:从录入体验到自动化记录

系统上线头两周,数据量增长非常缓慢。我一看操作日志就明白了:业务员根本没有主动打开系统,客户跟进记录基本是零录入。原因也很直白,他们原来的习惯是聊完客户随手记在微信里,现在要求他们“聊完客户还要去CRM里填一张表”,感知不到任何好处,只有额外的工作量。

这个问题的解法分了三步。第一步,把创建客户和录入跟进的表单极度简化,创建客户只需要填公司名和电话两个字段,其他全部后补,默认值做好;第二步,跟进记录改成类似聊天窗口的交互方式,选择和输入两步完成,键盘操作比重提高;第三步,集成企业微信和钉钉的会话归档能力,一线员工在用企业微信沟通时,消息可以自动归档到客户时间线里,不需要手工录入。

按这个思路改造了两周之后,日活跃率明显上升。经验总结成一句话:上线初期盯“活跃率”,别盯“报表准确度”。只有把录入成本压到比用户做这件事的抵触情绪更低,他们才会接受。

5.2 重复数据与并发冲突:合并功能和唯一索引

上线一个月左右,重复客户的问题开始集中暴露。同一个客户,有的销售录的是“华信科技”,有的录的是“上海华信科技”,还有联系人的重复,一个人在企业微信备注和Excel里各有一套记录。我们开发了客户合并功能:保留一个主客户,把副客户下的联系人和跟进记录全部迁移到主客户下,同时把副客户标记为合并状态,避免再次被搜索到。

并发问题也遇到过。有次两个业务员几乎同时给同一个客户创建订单,结果生成了两个一模一样的订单号,报错之后才发现业务代码里订单号只有日期加序号,缺少随机位。后来直接改成“业务前缀+年月日+4位随机字符”,数据库加唯一索引兜底,这个问题再没出现过。

这个问题也提醒我一个更大的原则:凡是涉及资源分配、编号生成、账户变动这类逻辑,数据库的唯一性约束是底线,程序逻辑是不能完全依赖的兜底方案。

5.3 通知漏发与慢查询:索引补齐是必修课

上线跑了一两个月之后,有人反馈“明天该联系客户了,但今天没有收到提醒”。排查发现,定时任务扫描确实执行了,但邮件服务商的发送频率限制导致部分邮件被吞掉了,而且失败任务没有重试机制。后来改了两处:定时任务失败的消息自动进入重试队列,第二天统一补发;通知默认走站内信,降低对第三方服务商的依赖。

另一个非常典型的性能问题是慢查询。跟进记录表的数据量上来后,客户详情页的列表打开要好几秒,直接把用户体验拉回原始时代。用EXPLAIN分析后确认,表没建联合索引,查询进行了全表扫描。加了(company_id, created_at desc)联合索引,列表页改成游标分页而不是深分页之后,查询时间从秒级降到了毫秒级。

这里想补充一个实际建议:建索引要围绕核心查询路径来建,不用追求覆盖所有场景。更新频繁的字段不适合建太多索引,否则写入性能反而会拖慢。CRM这种系统,查询量远大于写入量,索引要优先服务于列表页和报表聚合这类高频查询。

5.4 安全与可用性的底线

CRM里面存的是企业的核心商业数据,安全不能只停留在嘴上。密码策略要强制复杂度和定期更换;登录日志要记录IP、设备、时间,异常登录要触发提醒;管理员每天收到一份“今日关键操作汇总”,什么时间谁删了客户、改了回款金额,都会在汇总里体现出来。

可用性方面,我们保持每天全量备份、每周一次增量备份、每月一次恢复演练。虽然前期多花了一些时间,但用的都是自动化脚本,实际投入并不大。对一个以客户数据为生产资料的系统来说,备份恢复这条底线守住了,其他问题都是小问题。

6. 我个人用下来的几点体会

6.1 系统的成败,取决于一线是否愿意用它

跑完这大半年,我最深的体会就是:一套CRM系统,功能再华丽,一线员工不想用,那就是零。很多人会以为CRM是管理工具,是拿来“监控”销售的,但从实际操作看,它首先应该是一线员工的工作助手,让他们觉得“用了这系统,我找客户资料更方便、跟进更不容易漏、汇报更省事”,他们才会真正用起来。

这个认知直接影响了我之后的迭代方向。凡是能降低录入成本的功能优先级都最高,比如自动归档、快捷记录、重复信息自动识别。凡是给管理增加便利但给一线增加负担的“看起来很酷”的功能,再想要也要谨慎。做项目最难的是取舍,CRM的取舍标准很明确:一线用起来,系统才会有生命力。

6.2 后续可以扩展的方向

DeskcommCRM做到现在这个程度,只能算完成了第一阶段的循环。如果继续往前推进,我最想做的三个方向是:深度集成企业微信会话存档,把一线日常沟通自动沉淀到客户时间线;自动化流程能力,比如新线索自动分配、沉默客户自动预警、逾期未回款自动通知主管;移动端轻应用,方便业务员在拜访路上随时查看客户资料和记录跟进。

当初立这个项目的目标,从来不是做一套多么庞大的系统,而是让一个十个二十个人的团队,能像大公司一样把客户资产管得清清楚楚。这个目标基本达到了,而且整个项目的技术方案和产品思路都可以复制。如果你也在被客户数据割裂、跟进无记录、交接全靠嘴这些问题困扰,照着这套思路搭一套轻量CRM,会是一条靠谱的路径。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 3:58:06

GAN训练实战:从原理到PyTorch实现,避开三大经典坑

我第一次跑通GAN是在一个编号为G1的练习项目上。训练过程相当魔幻:损失曲线一路降到近乎为零,我心里想着"这波稳了",结果生成的图像全是灰蒙蒙的噪声;后来我把判别器调整到稍微收敛一些,图像又迅速塌缩成同一…

作者头像 李华
网站建设 2026/10/19 3:56:54

AI模型评估体系构建指南:从散装评测到自动化回归

你有没有遇到过这种局面:本地测试集上准确率从82%涨到了85%,团队士气高涨,结果一上线,线上监控纹丝不动,业务方跑过来说“感觉和之前没区别”。我见过不少团队卡在这一步,包括我自己早期也栽过。后来复盘发…

作者头像 李华
网站建设 2026/10/19 3:56:54

Kafka Connect JDBC Sink数据一致性原理与生产避坑指南

1. 为什么JDBC Sink不是“把数据倒进数据库”那么简单很多人第一次接触Kafka Connect JDBC Sink时,心里想的是一条很朴素的流水线:Kafka里有消息 → Sink Connector读出来 → 插进MySQL/PostgreSQL里。我最初也是这么想的,直到在某次模拟项目…

作者头像 李华
网站建设 2026/10/19 3:55:32

电动汽车直流充电机仿真建模与谐波分析实战解析

电动汽车直流充电机的仿真建模与谐波分析,这个项目我前前后后做过好几轮,每次做完都有新的体会。可能很多人一看标题,觉得无非就是把三相整流桥加个直流侧电容,跑个仿真看看波形,算个THD(总谐波畸变率&…

作者头像 李华
网站建设 2026/10/19 3:54:09

降AI痕迹提示词实战指南:从宏观结构到微观措辞的完整方案

直接说结论吧:市面上绝大多数“降 AI 痕迹”的提示词,之所以用完还是能一眼被看出来,是因为它们只在“形式”上打转,比如要求 AI 换个开头、加个语气词、减少连接词。真正好用的降 AI 痕迹提示词,必须同时管住三个层面…

作者头像 李华
网站建设 2026/10/19 3:53:10

编译原理预处理实验:状态机实现注释清除与行号映射

这次做的是编译原理课程的源程序预处理实验。在整个编译流程里,预处理往往是最不起眼的一环——词法分析、语法分析、中间代码生成,一个比一个听着“高级”,而预处理听起来无非就是把注释和空格清一清。可真动手实现一遍才知道,越…

作者头像 李华