# SCNU-Compiler-Construction-2023 **Repository Path**: pylog/scnu-compiler-construction-2023 ## Basic Information - **Project Name**: SCNU-Compiler-Construction-2023 - **Description**: 重修之编译原理项目课 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: https://0xffff.one/d/2014 - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-07-10 - **Last Updated**: 2024-09-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### Intro - 项目总览 ```mermaid stateDiagram-v2 [*] --> Index Index --> Lexer Index --> Parser Index --> Analyst state Index { 语言信息 --> 用户输入 语言信息 --> 载入内置 载入内置 --> Tiny语言 载入内置 --> MiniC语言 用户输入 --> 语言名称 用户输入 --> 词法规则 用户输入 --> 文法终结符号 用户输入 --> 文法产生式 } state Lexer { 语言信息中的所有词法规则 --> 单条词法规则的细节 单条词法规则的细节 --> 对应的正则定义式 对应的正则定义式 --> 与正则表达式等价的NFA 与正则表达式等价的NFA --> 与NFA等价的DFA 与NFA等价的DFA --> 最小化的DFA 最小化的DFA --> 模拟最小化DFA的C语言代码 } state Parser { 语言信息中的文法规则 --> 提取左公因子后的文法规则 提取左公因子后的文法规则 --> 消除左递归后的文法规则 消除左递归后的文法规则 --> First集合 First集合 --> Follow集合 Follow集合 --> LL(1)表 } state Analyst { 内置的示例代码 --> 被分析的代码 用户输入的代码 --> 被分析的代码 被分析的代码 --> 词法分析(基于最小化DFA或者基于C代码) 词法分析(基于最小化DFA或者基于C代码)--> Tokens Tokens --> 文法分析器(基于LL(1)表) 文法分析器(基于LL(1)表)--> 语法树 } ``` #### Usage - 图形界面使用方法 |url| | |:--|:--| | `/` |主页,用户可在此输入 Language 结构体中所需的信息:词法规则、终结符号和文法规则。或者直接加载内置的例子:Tiny 或者 MiniC| |`/lexer/`| 显示用户所有输入的词法规则,提供查看单条词法细节的按钮| |`/lexer/detail/` | 显示单条词法规则的细节:正则定义式、NFA、DFA、最小化 DFA 和生成的 C 代码。使用 Get 请求,传递 `ruler=?` 参数,以确定要查看的是哪一条规则| |`/parser/` | 显示用户所输入的文法规则:原始的产生式、提取左公因子后的产生式、消除左递归后的产生式、First 和 Follow 集合,以及构造出的 LL(1) 表| |`/analyst/` | 用户可在此输入被分析的代码文本。如果加载了内置的例子,此处同时会加载其示例代码。根据用户此前的输入,得到 Lexer 和 Parser,先后进行词法和文法的分析,分别显示其输出的 Tokens 和 Syntax Tree | #### Build - 编译方法 本实验使用 Go 语言编写,是跨平台的。Go 语言的版本需大于等于 1.22,并在首次编译前,进行以下操作: ```sh // 修改代理为国内 go env -w GOPROXY="https://goproxy.cn,direct" // 安装(前端的)第三方依赖 go mod tidy ``` 而后是编译本程序,可简单使用 `./src/build.sh`,或者在 `./src` 目录下手动运行: ```sh go build -o ../exec ```