增加文档

This commit is contained in:
Luke 2025-04-28 16:00:48 +08:00
parent 4ba7f6c2f7
commit a7f1627df0
18 changed files with 176 additions and 56 deletions

View File

@ -1,6 +1,6 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="Main" type="Application" factoryName="Application" nameIsGenerated="true"> <configuration default="false" name="Main" type="Application" factoryName="Application" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.compiler.Main" /> <option name="MAIN_CLASS_NAME" value="org.jcnc.snow.compiler.cli.SnowCompiler" />
<module name="SCompiler" /> <module name="SCompiler" />
<option name="PROGRAM_PARAMETERS" value="test" /> <option name="PROGRAM_PARAMETERS" value="test" />
<extension name="coverage"> <extension name="coverage">

View File

@ -1,27 +1,19 @@
package org.jcnc.snow.compiler; package org.jcnc.snow.compiler.cli;
import org.jcnc.snow.compiler.lexer.LexerEngine; import org.jcnc.snow.compiler.lexer.core.LexerEngine;
import org.jcnc.snow.compiler.lexer.token.Token; import org.jcnc.snow.compiler.lexer.token.Token;
import org.jcnc.snow.compiler.lexer.utils.TokenPrinter;
import org.jcnc.snow.compiler.parser.core.ParserEngine; import org.jcnc.snow.compiler.parser.core.ParserEngine;
import org.jcnc.snow.compiler.parser.ast.ModuleNode;
import org.jcnc.snow.compiler.parser.context.ParserContext; import org.jcnc.snow.compiler.parser.context.ParserContext;
import org.jcnc.snow.compiler.parser.ast.base.Node; import org.jcnc.snow.compiler.parser.ast.base.Node;
import org.jcnc.snow.compiler.parser.function.ASTPrinter;
import org.jcnc.snow.compiler.semantic.core.SemanticAnalyzer;
import org.jcnc.snow.compiler.semantic.core.SemanticAnalyzerRunner; import org.jcnc.snow.compiler.semantic.core.SemanticAnalyzerRunner;
import org.jcnc.snow.compiler.semantic.error.SemanticError;
import org.jcnc.snow.compiler.semantic.utils.SemanticAnalysisReporter;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
public class Main { public class SnowCompiler {
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
// 读取源文件 // 读取源文件
String source = Files.readString(Path.of(args[0]), StandardCharsets.UTF_8); String source = Files.readString(Path.of(args[0]), StandardCharsets.UTF_8);

View File

@ -1,5 +1,6 @@
package org.jcnc.snow.compiler.lexer; package org.jcnc.snow.compiler.lexer.base;
import org.jcnc.snow.compiler.lexer.core.LexerContext;
import org.jcnc.snow.compiler.lexer.token.Token; import org.jcnc.snow.compiler.lexer.token.Token;
import java.util.List; import java.util.List;

View File

@ -1,10 +1,12 @@
package org.jcnc.snow.compiler.lexer; package org.jcnc.snow.compiler.lexer.core;
import org.jcnc.snow.compiler.lexer.base.TokenScanner;
/** /**
* {@code LexerContext} 是词法分析中的状态管理器负责追踪当前字符位置 * {@code LexerContext} 是词法分析中的状态管理器负责追踪当前字符位置
* 行号列号并提供字符读取匹配等功能 * 行号列号并提供字符读取匹配等功能
* <p> * <p>
* 它是 {@link LexerEngine} {@link org.jcnc.snow.compiler.lexer.TokenScanner} * 它是 {@link LexerEngine} {@link TokenScanner}
* 之间共享的上下文对象用于读取字符并记录位置信息 * 之间共享的上下文对象用于读取字符并记录位置信息
*/ */
public class LexerContext { public class LexerContext {

View File

@ -1,5 +1,6 @@
package org.jcnc.snow.compiler.lexer; package org.jcnc.snow.compiler.lexer.core;
import org.jcnc.snow.compiler.lexer.base.TokenScanner;
import org.jcnc.snow.compiler.lexer.scanners.*; import org.jcnc.snow.compiler.lexer.scanners.*;
import org.jcnc.snow.compiler.lexer.token.Token; import org.jcnc.snow.compiler.lexer.token.Token;

View File

@ -1,42 +1,51 @@
# Snow Compiler - Lexer 模块 # Snow Compiler - Lexer 模块
🎯 这是 `Snow Compiler` 项目的词法分析模块,负责将源代码解析为一系列结构化的 Token为后续的语法分析Parser或解释器Interpreter做准备。 > Snow 编译器的前端模块 —— 负责将源代码扫描并生成 Token 流
--- ## 项目简介
## 🧠 核心模块职责 **Lexer** 是 [Snow 编译器]() 项目的子模块,承担编译器前端的词法分析阶段任务。
它负责将源代码输入,根据 Snow 语言的语法规则,识别并划分为有意义的 Token 流为后续语法解析Parser提供标准输入。
| 模块 | 说明 | 该模块采用模块化设计,每类 Token 类型如标识符、运算符、数字、字符串等由独立的扫描器Scanner负责识别提高了扩展性和可维护性。
|----------------------|-----------------------------------------------------|
| `LexerEngine` | 主引擎,接收字符流,分发给各个 `TokenScanner` 处理 |
| `LexerContext` | 封装源码字符流和当前扫描状态(如 `peek()``advance()` |
| `TokenScanner` | 扫描器接口,所有扫描器需实现该接口进行识别与处理 |
| `scanners/` | 各类扫描器实现 |
| `token/` | Token 结构、类型定义、工厂方法 |
| `utils/TokenPrinter` | Token 输出辅助类,格式化打印 Token 序列 |
--- ## 核心功能
## 🔍 支持的 Token 类型 - **词法分析引擎**:从源代码提取标准化 Token 流
- **模块化扫描器体系**:按需扩展不同类型的 Token 识别
- **灵活的上下文管理**:跟踪源代码位置,支持错误处理
- **统一的 Token 工厂**:集中创建 Token 实例
- **工具支持**Token 打印与调试辅助
- 标识符(变量名、函数名) ## 模块结构
- 数字(整数、小数)
- 字符串(支持转义)
- 注释(单行、多行)
- 运算符(==, !=, &&, ||, <, >= 等)
- 符号(: , . + - * ( )
- 换行符
- 空白符(自动跳过)
- 未知字符(捕获非法或暂不支持的符号)
--- ```
lexer/
├── base/ // 公共基础接口
├── core/ // 词法分析核心引擎与上下文
├── scanners/ // 各类 Token 扫描器
├── token/ // Token 定义、工厂与类型
├── utils/ // 辅助工具(如 Token 打印)
└── doc/ // 项目文档
```
## 🚀 示例:使用 LexerEngine 分析源码 ## 快速上手
```java ```
String code = "let x = 42;\nprint(\"hello\")"; // 1. 创建词法分析引擎实例
LexerEngine lexer = new LexerEngine(); LexerEngine engine = new LexerEngine();
List<Token> tokens = lexer.tokenize(code);
// 输出 token 流 // 2. 提供源代码输入
String sourceCode = "let x = 5 + 3;";
// 3. 执行分析,生成 Token 流
List<Token> tokens = engine.tokenize(sourceCode);
// 4. 可选:打印 Token 列表,便于调试
TokenPrinter.print(tokens); TokenPrinter.print(tokens);
```
## 开发环境
- JDK 21 或更高版本
- 建议使用 Maven 进行构建管理

View File

@ -1,7 +1,7 @@
package org.jcnc.snow.compiler.lexer.scanners; package org.jcnc.snow.compiler.lexer.scanners;
import org.jcnc.snow.compiler.lexer.LexerContext; import org.jcnc.snow.compiler.lexer.core.LexerContext;
import org.jcnc.snow.compiler.lexer.TokenScanner; import org.jcnc.snow.compiler.lexer.base.TokenScanner;
import org.jcnc.snow.compiler.lexer.token.Token; import org.jcnc.snow.compiler.lexer.token.Token;
import java.util.List; import java.util.List;

View File

@ -1,6 +1,6 @@
package org.jcnc.snow.compiler.lexer.scanners; package org.jcnc.snow.compiler.lexer.scanners;
import org.jcnc.snow.compiler.lexer.LexerContext; import org.jcnc.snow.compiler.lexer.core.LexerContext;
import org.jcnc.snow.compiler.lexer.token.Token; import org.jcnc.snow.compiler.lexer.token.Token;
import org.jcnc.snow.compiler.lexer.token.TokenType; import org.jcnc.snow.compiler.lexer.token.TokenType;

View File

@ -1,6 +1,6 @@
package org.jcnc.snow.compiler.lexer.scanners; package org.jcnc.snow.compiler.lexer.scanners;
import org.jcnc.snow.compiler.lexer.LexerContext; import org.jcnc.snow.compiler.lexer.core.LexerContext;
import org.jcnc.snow.compiler.lexer.token.Token; import org.jcnc.snow.compiler.lexer.token.Token;
import org.jcnc.snow.compiler.lexer.token.TokenFactory; import org.jcnc.snow.compiler.lexer.token.TokenFactory;

View File

@ -1,6 +1,6 @@
package org.jcnc.snow.compiler.lexer.scanners; package org.jcnc.snow.compiler.lexer.scanners;
import org.jcnc.snow.compiler.lexer.LexerContext; import org.jcnc.snow.compiler.lexer.core.LexerContext;
import org.jcnc.snow.compiler.lexer.token.Token; import org.jcnc.snow.compiler.lexer.token.Token;
import org.jcnc.snow.compiler.lexer.token.TokenType; import org.jcnc.snow.compiler.lexer.token.TokenType;

View File

@ -1,6 +1,6 @@
package org.jcnc.snow.compiler.lexer.scanners; package org.jcnc.snow.compiler.lexer.scanners;
import org.jcnc.snow.compiler.lexer.LexerContext; import org.jcnc.snow.compiler.lexer.core.LexerContext;
import org.jcnc.snow.compiler.lexer.token.Token; import org.jcnc.snow.compiler.lexer.token.Token;
import org.jcnc.snow.compiler.lexer.token.TokenType; import org.jcnc.snow.compiler.lexer.token.TokenType;

View File

@ -1,6 +1,6 @@
package org.jcnc.snow.compiler.lexer.scanners; package org.jcnc.snow.compiler.lexer.scanners;
import org.jcnc.snow.compiler.lexer.LexerContext; import org.jcnc.snow.compiler.lexer.core.LexerContext;
import org.jcnc.snow.compiler.lexer.token.Token; import org.jcnc.snow.compiler.lexer.token.Token;
import org.jcnc.snow.compiler.lexer.token.TokenType; import org.jcnc.snow.compiler.lexer.token.TokenType;

View File

@ -1,6 +1,6 @@
package org.jcnc.snow.compiler.lexer.scanners; package org.jcnc.snow.compiler.lexer.scanners;
import org.jcnc.snow.compiler.lexer.LexerContext; import org.jcnc.snow.compiler.lexer.core.LexerContext;
import org.jcnc.snow.compiler.lexer.token.Token; import org.jcnc.snow.compiler.lexer.token.Token;
import org.jcnc.snow.compiler.lexer.token.TokenType; import org.jcnc.snow.compiler.lexer.token.TokenType;

View File

@ -1,6 +1,6 @@
package org.jcnc.snow.compiler.lexer.scanners; package org.jcnc.snow.compiler.lexer.scanners;
import org.jcnc.snow.compiler.lexer.LexerContext; import org.jcnc.snow.compiler.lexer.core.LexerContext;
import org.jcnc.snow.compiler.lexer.token.Token; import org.jcnc.snow.compiler.lexer.token.Token;
import org.jcnc.snow.compiler.lexer.token.TokenType; import org.jcnc.snow.compiler.lexer.token.TokenType;

View File

@ -1,6 +1,6 @@
package org.jcnc.snow.compiler.lexer.scanners; package org.jcnc.snow.compiler.lexer.scanners;
import org.jcnc.snow.compiler.lexer.LexerContext; import org.jcnc.snow.compiler.lexer.core.LexerContext;
import org.jcnc.snow.compiler.lexer.token.Token; import org.jcnc.snow.compiler.lexer.token.Token;
import org.jcnc.snow.compiler.lexer.token.TokenType; import org.jcnc.snow.compiler.lexer.token.TokenType;

View File

@ -1,6 +1,6 @@
package org.jcnc.snow.compiler.lexer.scanners; package org.jcnc.snow.compiler.lexer.scanners;
import org.jcnc.snow.compiler.lexer.LexerContext; import org.jcnc.snow.compiler.lexer.core.LexerContext;
import org.jcnc.snow.compiler.lexer.token.Token; import org.jcnc.snow.compiler.lexer.token.Token;
/** /**

View File

@ -0,0 +1,59 @@
# Snow Compiler - Parser 模块
> Snow 编译器的前端模块 —— 负责将 Token 流解析为抽象语法树AST
## 项目简介
**Parser** 是 [Snow 编译器]() 项目的子模块,承担编译器前端的解析阶段任务。
它负责将词法分析得到的 Token 流,按照 Snow 语言的语法规则解析为标准的抽象语法树AST
框架使用了 Pratt 解析算法处理表达式,同时采用模块化设计,支持声明、函数、条件语句、循环语句等各类结构的解析。
## 核心功能
- **抽象语法树AST生成**:定义丰富的 AST 节点类型
- **表达式解析器**:基于 Pratt 解析,支持优先级、调用、成员访问等
- **语句解析器**:支持 Snow 语言中的声明、控制流等
- **模块解析器**:处理 `import` 导入声明
- **函数解析器**:支持函数定义与调用
- **灵活的解析上下文管理**:错误处理与流式 Token 管理
- **工具支持**AST JSON 序列化,便于调试与前后端通信
## 模块结构
```
parser/
├── ast/ // AST 节点定义
├── base/ // 顶层解析器接口
├── context/ // 解析上下文与异常处理
├── core/ // 核心解析引擎
├── expression/ // 表达式解析模块
├── factory/ // 解析器工厂
├── function/ // 函数解析及 AST 打印
├── module/ // 模块导入解析
├── statement/ // 各类语句解析器
└── utils/ // JSON 序列化、辅助方法
```
## 快速上手
```
// 1. 创建解析引擎实例
ParserEngine engine = new ParserEngine();
// 2. 准备 Token 流(通常由词法分析器生成)
TokenStream tokenStream = ...;
// 3. 执行解析,生成 AST
ModuleNode ast = engine.parse(tokenStream);
// 4. 可选:将 AST 序列化为 JSON 格式,便于调试
String astJson = ASTJsonSerializer.serialize(ast);
System.out.println(astJson);
```
## 开发环境
- JDK 21 或更高版本
- 建议使用 Maven 进行构建管理

View File

@ -0,0 +1,56 @@
# Snow Compiler - Semantic 模块
> Snow 编译器的前端模块 —— 负责语义分析与符号表管理
## 项目简介
**Semantic** 是 [Snow 编译器]() 项目的子模块,承担编译器前端的语义分析阶段任务。
它负责在抽象语法树AST基础上进行符号绑定、类型检查、作用域管理等操作确保程序符合语义规则并为后续中间代码生成IR阶段提供准备。
该模块采用模块化设计,针对不同类型的表达式与语句提供独立的分析器,同时内置完整的符号表和类型系统支持。
## 核心功能
- **表达式与语句语义分析**:根据 Snow 语言规范校验各类 AST 节点
- **符号表管理**:支持作用域嵌套、符号绑定与查找
- **类型系统**:内建基础类型与函数类型推导
- **语义错误报告**:标准化错误收集与输出
- **可扩展的分析器体系**:按节点类型组织,便于维护与扩展
## 模块结构
```
semantic/
├── analyzers/ // 各类表达式和语句分析器
│ ├── base/ // 基础分析器接口
│ ├── expression/ // 表达式分析器
│ └── statement/ // 语句分析器
├── core/ // 核心分析引擎与上下文管理
├── error/ // 语义错误定义
├── symbol/ // 符号表系统
├── type/ // 类型系统
└── utils/ // 辅助工具
```
## 快速上手
```
// 1. 创建语义分析引擎实例
SemanticAnalyzerRunner runner = new SemanticAnalyzerRunner();
// 2. 准备待分析的 AST通常由 Parser 生成)
ModuleNode ast = ...;
// 3. 执行语义分析
runner.analyze(ast);
// 4. 可选:检查并输出语义分析报告
SemanticAnalysisReporter.report(runner.getErrors());
```
## 开发环境
- JDK 21 或更高版本
- 建议使用 Maven 进行构建管理
---