compiler 模块注释完善:Doxygen 风格(Lexer/Parser/Linker/Typecheck/Project/MachineConfig/TypeInfo/Codec/Codegen/Stb/main 共 21 个文件)

This commit is contained in:
2026-08-21 23:29:15 +08:00
parent fff7aef968
commit b0aebe264e
21 changed files with 1332 additions and 341 deletions
+91 -67
View File
@@ -1,6 +1,9 @@
/**
* @file Lexer.h
* @brief ST 子集词法分析
* @details 本文件是词法层对外接口:定义 token 类型(Tok)、token 载体
* Token)与两个入口(lex / lex_file)。扫描器实现见 Lexer.cpp
* 关键字与 token 集见 Doc/compiler/词法.md。
* @author
* @date 2026-08-21
*/
@@ -13,84 +16,105 @@
namespace compiler {
// token 类型。关键字与 token 集见 Doc/compiler/词法.md。
/**
* @brief token 类型枚举。
* @details 关键字与 token 集见 Doc/compiler/词法.md;关键字共 25 个,
* 与 12.1 冻结表一致(12.5 修订补入 THEN/DO)。顺序冻结后
* 不得插值改动,只能追加到末尾。
*/
enum class Tok {
// 关键字(25 个,与 12.1 冻结表一致)
PROGRAM,
FUNCTION,
FUNCTION_BLOCK,
END_PROGRAM,
END_FUNCTION,
END_FUNCTION_BLOCK,
VAR,
VAR_INPUT,
VAR_OUTPUT,
VAR_GLOBAL,
VAR_EXTERNAL,
END_VAR,
BOOL,
INT,
TIME,
IF,
ELSIF,
ELSE,
END_IF,
WHILE,
END_WHILE,
THEN, // 12.5 修订:IF/WHILE 语法需要,补入关键字表
DO, // 同上
AND,
OR,
NOT,
TRUE,
FALSE,
TON,
TOF,
TP,
CTU,
CTD,
CTUD,
R_TRIG,
F_TRIG,
PROGRAM, ///< PROGRAM 声明起始
FUNCTION, ///< FUNCTION 声明起始
FUNCTION_BLOCK, ///< FUNCTION_BLOCK 声明起始
END_PROGRAM, ///< PROGRAM 结束
END_FUNCTION, ///< FUNCTION 结束
END_FUNCTION_BLOCK, ///< FUNCTION_BLOCK 结束
VAR, ///< 局部变量段(VAR)起始
VAR_INPUT, ///< 输入变量段起始
VAR_OUTPUT, ///< 输出变量段起始
VAR_GLOBAL, ///< 全局变量段起始
VAR_EXTERNAL, ///< 外部变量段起始
END_VAR, ///< 变量段结束
BOOL, ///< 布尔类型
INT, ///< 整数类型
TIME, ///< 时间类型
IF, ///< IF 关键字
ELSIF, ///< ELSIF 关键字
ELSE, ///< ELSE 关键字
END_IF, ///< IF 结束
WHILE, ///< WHILE 关键字
END_WHILE, ///< WHILE 结束
THEN, ///< IF/ELSIF 分支引导(12.5 修订补入关键字表
DO, ///< WHILE 循环体引导(12.5 修订补入关键字表)
AND, ///< 逻辑与
OR, ///< 逻辑或
NOT, ///< 逻辑非(前缀)
TRUE, ///< 布尔真字面量
FALSE, ///< 布尔假字面量
TON, ///< 内建 FB 类型名
TOF, ///< 内建 FB 类型名
TP, ///< 内建 FB 类型名
CTU, ///< 内建 FB 类型名
CTD, ///< 内建 FB 类型名
CTUD, ///< 内建 FB 类型名
R_TRIG, ///< 内建 FB 类型名
F_TRIG, ///< 内建 FB 类型名
// 字面量
IDENT, // text = 小写名
INT_LIT, // int_value
TIME_LIT, // int_value = 毫秒
IDENT, ///< 标识符(text = 小写名
INT_LIT, ///< 整数字面量(int_value
TIME_LIT, ///< 时间字面量(int_value = 毫秒
// 符号
ASSIGN, // :=
EQ, // =
NE, // <>
LT, // <
LE, // <=
GT, // >
GE, // >=
PLUS, // +
MINUS, // -
STAR, // *
SLASH, // /
LPAREN, // (
RPAREN, // )
COMMA, // ,
SEMI, // ;
COLON, // :
DOT, // .
END, // 文件结束
ASSIGN, ///< :=(赋值)
EQ, ///< =(等于)
NE, ///< <>(不等)
LT, ///< <(小于)
LE, ///< <=(小于等于)
GT, ///< >(大于)
GE, ///< >=(大于等于)
PLUS, ///< +(加)
MINUS, ///< -(减)
STAR, ///< *(乘)
SLASH, ///< /(除)
LPAREN, ///< ((左括号)
RPAREN, ///< )(右括号)
COMMA, ///< ,(逗号)
SEMI, ///< ;(分号)
COLON, ///< :(冒号)
DOT, ///< .(点,FB 字段访问)
END, ///< 文件结束哨兵
};
/**
* @brief 单个 token:类型 + 文本/字面量值 + 源位置。
* @details line/col 从 1 起,记录 token 起始字符的位置。
*/
struct Token {
Tok type;
std::string text; // 标识符/关键字的小写文本;字面量原文
int64_t int_value; // INT_LIT / TIME_LIT(毫秒)
std::string source_file;
uint32_t line; // 从 1 起
uint32_t col; // 从 1 起
Tok type; ///< token 类型
std::string text; ///< 标识符/关键字的小写文本;字面量原文
int64_t int_value; ///< INT_LIT / TIME_LIT(毫秒)的字面量值
std::string source_file; ///< 来源文件名
uint32_t line; ///< 起始行(从 1 起
uint32_t col; ///< 起始列(从 1 起
};
// 对源文本 lex 成 token 流(含末尾 END)。失败返回 false,
// err 前缀 "lex error",带文件与行列
/**
* @brief 对源文本做词法分析,产出 token 流(含末尾 END)
* @param source_file 源文件名(写入每个 token 的 source_file 并用于报错)
* @param content 源文本
* @param out 输出 token 流
* @param err 错误输出;可为 nullptr(静默)
* @return true 成功;false 失败(err 前缀 "lex error",带文件与行列)
*/
bool lex(const std::string& source_file, const std::string& content,
std::vector<Token>* out, std::string* err);
// 读文件后 lex(文件不存在 / 读取失败也算 lex error
/**
* @brief 读取文件后做词法分析。
* @param path 文件路径
* @param out 输出 token 流
* @param err 错误输出;可为 nullptr(静默)
* @return true 成功;false 失败(文件不存在 / 读取失败也算 lex error
*/
bool lex_file(const std::string& path, std::vector<Token>* out, std::string* err);
}