# lexical-analyzer **Repository Path**: CodexploRe/lexical-analyzer ## Basic Information - **Project Name**: lexical-analyzer - **Description**: LexicalAnalyzer 词法分析器,实现:正则表达式-->NFA--->DFA-->最小化DFA-->词法分析程序。编译原理基础。 - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-03-25 - **Last Updated**: 2025-03-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 编译原理项目:分词器 ## 简介 本项目是一个简单的分词器,用于编译原理课程的实践。它能够读取源代码文件,将其分解成一系列的标记(`tokens`),为后续的语法分析和语义分析做准备。 ## 功能 - 识别关键字、标识符、常量、运算符和界符等。 - 处理注释和空白字符。 - 生成标记文件,供后续处理。 ## 使用方法 1. 准备代码标记正则文件,可以参考[tiny_tokens.txt](https://gitee.com/CodexploRe/lexical-analyzer/blob/master/tiny_tokens.txt)文件,注意点如下: - 左侧为正则名称,右侧为正则值,中间使用`=`分隔 - 正则名前缀有以下三种,分别代表不同含义,编写标记文件时请务必注意: 1. 不包含特殊前缀的正则是用于辅助的正则,该类正则可以出现在第二和第三类正则的正则值中,减少正则编码。如数字的正则,正则应当编写为`digit=[0-9]`。 2. 前缀为单横杆`_`的正则代表分词的一种种类,将作用到后续的划分`token`逻辑和`token`类型判断逻辑中。如小于等于号的正则,正则应当编写为`_lessEqual=<=`。 3. 前缀为双横杆`__`的正则是分词种类中的特殊种类:关键字,该类正则将仅参与`token`的类别判断逻辑而不参与划分`token`的逻辑。如关键字`if`,正则应当编写为`__if=if`。 - 具体编写可以参考[tiny_tokens.txt](https://gitee.com/CodexploRe/lexical-analyzer/blob/master/tiny_tokens.txt)文件 2. 准备代码源文件,参考[source_code.tiny](https://gitee.com/CodexploRe/lexical-analyzer/blob/master/source_code.tiny)文件,无特殊要求 3. 修改[main.cpp](https://gitee.com/CodexploRe/lexical-analyzer/blob/master/main.cpp)文件的主程序,将上述两个文件的路径填入对应的参数中,注意使用**绝对路径**: ```c++ int main() { auto buffs = initBuffs("Path:/to/your/re.txt"); const auto reManager = ReManager(buffs); const auto faBuilder = FABuilder(reManager.reMap, reManager.reOfTokenType, reManager.reForAuxiliary); auto codeAnalyzer = CodeAnalyzer(faBuilder.DFAsAndEndsOfTokenType, faBuilder.DFAsAndEndsOfAuxiliary); codeAnalyzer.generateCppExe(); bool isOk = CodeAnalyzer::analyze("Path:/to/your/code.txt"); if (isOk) cout << "OK" << endl; else cout << "FAIL" << endl; return 0; } ``` 4. 检查[CMakeLists.txt](https://gitee.com/CodexploRe/lexical-analyzer/blob/master/CMakeLists.txt)文件配置正确后,编译运行代码,即可在终端中查看输出日志,日志示例参考[out.txt](https://gitee.com/CodexploRe/lexical-analyzer/blob/master/out.txt)文件(以`tiny`语言为例)。生成的`tokens.txt`文件在构建文件夹下,如果是`debug`模式,可能是如下路径:`./cmake-build-debug/tokens.txt`。 5. 在上述的同目录下,你可以看到一个名为`analyzer.cpp`的文件和同名的可执行文件,后续可以通过命令行参数直接使用该可执行文件进行词法分析逻辑,分词结果同样位于`tokens.txt`文件中,参考如下命令: ```bash analyzer.exe "Path:/to/your/code.txt" ``` 请注意**为参数带上引号`""`**,确保不会因为代码内容中的空格影响逻辑的执行。 ## 许可证 本项目遵循 [AGPL-3.0](https://www.gnu.org/licenses/agpl-3.0.zh-cn.html) 开源许可协议,请确保遵守AGPL-3.0的所有条款和条件。