# cxkcompiler **Repository Path**: caoxuekuncode/cxkcompiler ## Basic Information - **Project Name**: cxkcompiler - **Description**: 自己的编译器 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-11-28 - **Last Updated**: 2025-12-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 输入系统 ### 输入系统需要解决的问题 ```java 提供按照文件偏移量读取指定大小的字符的功能,如果上次已经读取到文件的最后一个字符了,那么将不再触发文件的读取功能 第5节视频还说需要预读取tag,比喻typedef int newInt,对于这个问题我们先暂放 和属性有关: 我们需要顶一个一个字符串最长的长度,否则无法定义缓冲区的长度,同样我们的缓冲区的大小可以依据是最大字符串长度的倍数,在从输入流中读取字符的时候,最好是最大字符串的倍数,这个设计比较好 陈老师在设计的时候,设置了一个变量,用于标识输入流中是否还有可以读取的信息的标识 目前还不是很明白陈老师在输入系统中说的loop ahead的含义,所以这里暂放 我们最好必须定义可以读取字节的起始偏移量和终止偏移量,因为在从输入流中刷新字节到缓冲区的时候,输入流中的字节很少,导致缓冲区只有部分能够使用, 还有一部分数据是脏数据,所以最好是有一个可以读取的缓冲区的起始和终止地址 输入流的偏移量交给输入流去管理 和方法有关: ``` ## Tompson构造法 ```java Tompson构造法核心主干: 什么是DFA,NFA 如何去构建状态机 宏定义: #define D {a,b} #define A [0-9] 状态机的构建 D|A(D)+ 所以状态机的构建就是利用构建好的宏定义进行 与,或,闭包,正闭包的运算去构建好 一行一行的将宏定义保存为键值对,目前先用String来保存宏的键值对的value值 ``` #### DFA ```java DFA叫做确定性有限状态机,也就是给定一个初始状态,出去的边必定是一个确定的字符, 并且如果有多条边,那么多条边的字符一定是不相同的 ``` ![](D:\ideacode\cxkcompiler\images\DFA.png) #### NFA ```java NFA叫做非确定性有限状态机,从一个初始状态出去的多条边可以是相同的字符,或者可以对应一条特殊的字符ε ``` ![](D:\ideacode\cxkcompiler\images\NFA.png) ### 利用宏定义构建状态机的案例 #### 浮点数的状态机 ![image-20241207171459046](images\fudian.png) #### 字符用宏定义表示 ```java D [0-9] 表示0-9的字符类 ``` #### 状态机的构建 ```java ({D}+ | {D}*\. {D}+ | {D}+ \. {D}*)(e{D}+)? 表示浮点数或科学计数法 ``` #### 状态机的构建过程 ### 宏定义的替换思路 ```java D [0-9] 通过单个字符进行解析,得到对应的宏为D,和对应宏的数据[0-9] 然后我们写我们的正则表达式,通过用{将对应的宏进行包裹} eg: {D}+ 如果我们需要嵌套宏,那么我们需要这样操作 A [0-9] D [a-z] AD {A}|{D} 然后我们去定义正则 {AD}+ ```