增加注释

This commit is contained in:
Luke 2025-05-11 23:26:32 +08:00
parent 2b8f648e54
commit fddfab6904
3 changed files with 109 additions and 108 deletions

View File

@ -1,28 +1,28 @@
package org.jcnc.snow.compiler.lexer.token; package org.jcnc.snow.compiler.lexer.token;
/** /**
* 表示词法分析过程中生成的一个 Token 实例包含其类型清洗后的词素原始片段及在源文件中的位置信息 * {@code Token} 表示词法分析过程中生成的最小语法单元
* 包含类型信息词素内容源代码中对应的原始文本片段以及精确的位置信息
* <p>
* 一个 Token 通常对应源代码中一个具有语义意义的片段如关键字标识符常量运算符等
* 区分 lexeme清洗后的词素 raw原始片段是为了支持如带引号的字符串注释等需要保留原始形式的元素
* </p>
*/ */
public class Token { public class Token {
/**
* Token 的类型 KEYWORDIDENTIFIERTYPE /** Token 的类型,如 KEYWORD、IDENTIFIER、TYPE 等。 */
*/
private final TokenType type; private final TokenType type;
/**
* 清洗后的词素内容例如去掉引号的字符串正文或注释正文 /** 清洗后的词素内容,例如去掉引号的字符串正文或注释正文。 */
*/
private final String lexeme; private final String lexeme;
/**
* 源代码中对应的原始片段可能包含引号或注释符号等 /** 源代码中对应的原始片段,可能包含引号、注释符号等。 */
*/
private final String raw; private final String raw;
/**
* Token 在源文件中的行号 1 开始计算 /** Token 在源文件中的行号,从 1 开始计数。 */
*/
private final int line; private final int line;
/**
* Token 在源文件行中的列号 1 开始计算 /** Token 在源文件行中的列号,从 1 开始计数。 */
*/
private final int col; private final int col;
/** /**
@ -31,8 +31,8 @@ public class Token {
* @param type Token 类型 * @param type Token 类型
* @param lexeme 清洗后的词素内容 * @param lexeme 清洗后的词素内容
* @param raw 源代码中的原始片段 * @param raw 源代码中的原始片段
* @param line 所在源文件的行号 1 开始 * @param line 所在源文件的行号 1 开始
* @param col 所在源文件行的列号 1 开始 * @param col 所在源文件行的列号 1 开始
*/ */
public Token(TokenType type, String lexeme, String raw, int line, int col) { public Token(TokenType type, String lexeme, String raw, int line, int col) {
this.type = type; this.type = type;
@ -43,77 +43,65 @@ public class Token {
} }
/** /**
* 构造一个简单的 Token 实例清洗后的词素与原始片段相同 * 构造一个简化形式的 Token词素与原始片段一致
* <p>适用于非注释非字符串等无需区分 raw lexeme 的场景</p> * <p>
* 适用于标识符关键字符号等不需要区分原始与清洗内容的 Token
* </p>
* *
* @param type Token 类型 * @param type Token 类型
* @param lexeme 词素内容原始片段 * @param lexeme Token 内容同时作为原始片段
* @param line 所在源文件的行号 1 开始 * @param line 行号
* @param col 所在源文件行的列号 1 开始 * @param col 列号
*/ */
public Token(TokenType type, String lexeme, int line, int col) { public Token(TokenType type, String lexeme, int line, int col) {
this(type, lexeme, lexeme, line, col); this(type, lexeme, lexeme, line, col);
} }
/** /**
* 创建一个表示文件结束EOF Token列号固定为 1词素与原始片段均为空字符串 * 构造并返回一个表示文件结束EOF Token 实例
* <p>
* 用于表示扫描结束的特殊符号
* </p>
* *
* @param line EOF Token 所在的行号通常为文件末尾的下一行 * @param line 文件结束所在行号
* @return 表示 EOF Token 实例 * @return EOF 类型 Token
*/ */
public static Token eof(int line) { public static Token eof(int line) {
return new Token(TokenType.EOF, "", "", line, 1); return new Token(TokenType.EOF, "", "", line, 1);
} }
/** /** @return 此 Token 的类型 */
* 获取此 Token 的类型
*
* @return Token 类型枚举
*/
public TokenType getType() { public TokenType getType() {
return type; return type;
} }
/** /** @return 清洗后的词素内容lexeme */
* 获取清洗后的词素内容
*
* @return 词素lexeme
*/
public String getLexeme() { public String getLexeme() {
return lexeme; return lexeme;
} }
/** /** @return 源代码中的原始片段 */
* 获取源代码中的原始片段
*
* @return 原始片段raw
*/
public String getRaw() { public String getRaw() {
return raw; return raw;
} }
/** /** @return Token 所在的源文件行号(从 1 开始) */
* 获取 Token 在源文件中的行号
*
* @return 行号 1 开始
*/
public int getLine() { public int getLine() {
return line; return line;
} }
/** /** @return Token 所在行的列号(从 1 开始) */
* 获取 Token 在源文件行中的列号
*
* @return 列号 1 开始
*/
public int getCol() { public int getCol() {
return col; return col;
} }
/** /**
* 返回 Token 的字符串表示包含类型词素行号和列号便于调试输出 * 返回该 Token 的字符串表示包含类型词素行列信息
* <p>
* 通常用于日志打印或调试目的
* </p>
* *
* @return 格式如 Token(type=TYPE, lexeme='value', line=1, col=5) * @return Token 的描述性字符串
*/ */
@Override @Override
public String toString() { public String toString() {
@ -122,4 +110,4 @@ public class Token {
type, lexeme, line, col type, lexeme, line, col
); );
} }
} }

View File

@ -3,12 +3,17 @@ package org.jcnc.snow.compiler.lexer.token;
import java.util.Set; import java.util.Set;
/** /**
* TokenFactory 用于根据原始的词法单元字符串raw string * {@code TokenFactory} 是一个静态工厂类
* 判断其类型关键字类型名标识符等并创建对应的 Token 实例 * 用于根据原始的词法单元字符串文本
* 自动判断其词法类型并构造对应的 {@link Token} 实例
* <p>
* 支持自动识别语言关键字内置类型名合法标识符等
* 提供统一的 Token 构建机制简化词法扫描器的处理逻辑
* </p>
*/ */
public class TokenFactory { public class TokenFactory {
// 关键字集合包含语言中所有保留关键字 /** 语言保留关键字集合 */
private static final Set<String> KEYWORDS = Set.of( private static final Set<String> KEYWORDS = Set.of(
"module", "function", "parameter", "return_type", "module", "function", "parameter", "return_type",
"body", "end", "if", "then", "else", "loop", "body", "end", "if", "then", "else", "loop",
@ -16,31 +21,36 @@ public class TokenFactory {
"initializer", "condition", "update" "initializer", "condition", "update"
); );
// 类型集合包含语言中所有内置类型名称 /** 内置类型标识集合 */
private static final Set<String> TYPES = Set.of( private static final Set<String> TYPES = Set.of(
"int", "string", "float", "bool", "void", "double" "int", "string", "float", "bool", "void", "double"
); );
/** /**
* 创建一个 Token 实例 * 创建一个带类型推断的 {@link Token} 实例
* 根据原始字符串判断其类型并结合位置信息生成 Token * <p>
* 内部依据 {@code raw} 值匹配类型集合关键字集合
* 若都不匹配则视为合法标识符否则标记为 {@code UNKNOWN}
* </p>
* *
* @param raw 原始字符串词法单元文本 * @param raw 原始词法单元文本
* @param line 所在行号 * @param line Token 所在行号
* @param col 所在列号 * @param col Token 所在列号
* @return 对应类型的 Token 实例 * @return 类型明确 {@link Token} 实例
*/ */
public static Token create(String raw, int line, int col) { public static Token create(String raw, int line, int col) {
TokenType type = determineTokenType(raw); // 判断类型 TokenType type = determineTokenType(raw);
return new Token(type, raw, line, col); // 创建 Token return new Token(type, raw, line, col);
} }
/** /**
* 判断原始字符串所对应的 Token 类型 * 判定给定字符串所对应的 {@link TokenType}
* 优先级顺序类型 -> 关键字 -> 标识符 -> 未知 * <p>
* 优先级类型TYPE > 关键字KEYWORD > 标识符IDENTIFIER > 未知UNKNOWN
* </p>
* *
* @param raw 原始词法文本 * @param raw 原始词素字符串
* @return 对应的 TokenType * @return 推断出的 Token 类型
*/ */
private static TokenType determineTokenType(String raw) { private static TokenType determineTokenType(String raw) {
if (isType(raw)) return TokenType.TYPE; if (isType(raw)) return TokenType.TYPE;
@ -50,10 +60,10 @@ public class TokenFactory {
} }
/** /**
* 判断是否为内置类型名称 * 判断是否为内置类型标识
* *
* @param raw 字符串 * @param raw 输入字符串
* @return 如果是内置类型则返回 true * @return 若为类型名返回 {@code true}
*/ */
private static boolean isType(String raw) { private static boolean isType(String raw) {
return TYPES.contains(raw); return TYPES.contains(raw);
@ -62,21 +72,23 @@ public class TokenFactory {
/** /**
* 判断是否为语言关键字 * 判断是否为语言关键字
* *
* @param raw 字符串 * @param raw 输入字符串
* @return 如果是关键字则返回 true * @return 若为关键字返回 {@code true}
*/ */
private static boolean isKeyword(String raw) { private static boolean isKeyword(String raw) {
return KEYWORDS.contains(raw); return KEYWORDS.contains(raw);
} }
/** /**
* 判断是否为合法标识符 * 判断是否符合标识符命名规范
* 标识符必须以字母或下划线开头其后可接字母数字或下划线 * <p>
* 合法标识符需以字母或下划线开头其后可包含字母数字或下划线
* </p>
* *
* @param raw 字符串 * @param raw 输入字符串
* @return 如果是合法标识符则返回 true * @return 若为合法标识符则返回 {@code true}
*/ */
private static boolean isIdentifier(String raw) { private static boolean isIdentifier(String raw) {
return raw.matches("[a-zA-Z_][a-zA-Z0-9_]*"); return raw.matches("[a-zA-Z_][a-zA-Z0-9_]*");
} }
} }

View File

@ -1,9 +1,12 @@
package org.jcnc.snow.compiler.lexer.token; package org.jcnc.snow.compiler.lexer.token;
/** /**
* 表示 Snow 编程语言中的所有词法单元Token类型 * {@code TokenType} 枚举定义了 Snow 编程语言词法分析阶段可识别的所有词法单元类型
* <p> * <p>
* 这些类型用于标识词法分析阶段识别出的各种语法构成要素 * 每个枚举值代表一种语义类别
* 用于描述源代码中出现的关键字标识符字面量运算符控制符号等语言构件
* 在语法分析及后续处理阶段依赖该枚举对 Token 进行分类判断与分支处理
* </p>
*/ */
public enum TokenType { public enum TokenType {
@ -13,7 +16,7 @@ public enum TokenType {
/** 语言保留关键字(如 if、return、module 等) */ /** 语言保留关键字(如 if、return、module 等) */
KEYWORD, KEYWORD,
/** 类型名(如 int、string、bool 等) */ /** 内置类型名(如 int、string、bool 等) */
TYPE, TYPE,
/** 字符串字面量(如 "hello" */ /** 字符串字面量(如 "hello" */
@ -22,71 +25,69 @@ public enum TokenType {
/** 数字字面量(整数或浮点数) */ /** 数字字面量(整数或浮点数) */
NUMBER_LITERAL, NUMBER_LITERAL,
/** 冒号 ":" */ /** 冒号 ':' */
COLON, COLON,
/** 逗号 "," */ /** 逗号 ',' */
COMMA, COMMA,
/** 点号 "." */ /** 点号 '.' */
DOT, DOT,
/** 赋值符号 "=" */ /** 赋值符号 '=' */
EQUALS, EQUALS,
MODULO, // % /** 取模运算符 '%' */
MODULO,
/** 加号 '+' */
/** 加号 "+" */
PLUS, PLUS,
/** 乘号 "+" */ /** 乘号 '*' */
MULTIPLY, MULTIPLY,
/** 减号 "-" */ /** 减号 '-' */
MINUS, MINUS,
/** 左括号 "(" */ /** 左括号 '(' */
LPAREN, LPAREN,
/** 右括号 ")" */ /** 右括号 ')' */
RPAREN, RPAREN,
/** 相等比较 "==" */ /** 相等比较符号 '==' */
DOUBLE_EQUALS, DOUBLE_EQUALS,
/** 不等比较 "!=" */ /** 不等比较符号 '!=' */
NOT_EQUALS, NOT_EQUALS,
/** 大于符号 ">" */ /** 大于符号 '>' */
GREATER_THAN, GREATER_THAN,
/** 大于等于符号 ">=" */ /** 大于等于符号 '>=' */
GREATER_EQUAL, GREATER_EQUAL,
/** 小于符号 "<" */ /** 小于符号 '<' */
LESS_THAN, LESS_THAN,
/** 小于等于符号 "<=" */ /** 小于等于符号 '<=' */
LESS_EQUAL, LESS_EQUAL,
/** 逻辑与符号 "&&" */ /** 逻辑与符号 '&&' */
AND, AND,
/** 逻辑或符号 "||" */ /** 逻辑或符号 '||' */
OR, OR,
/** 换行符,表示逻辑上的新行 */ /** 换行符,标识逻辑换行 */
NEWLINE, NEWLINE,
/** 单行或多行注释 */ /** 单行或多行注释内容 */
COMMENT, COMMENT,
/** 文件结束符End of File */ /** 文件结束符End of File */
EOF, EOF,
/** 无法识别的非法或未知符号 */ /** 无法识别的非法或未知符号 */
UNKNOWN, UNKNOWN
}
}