compiler 模块注释完善:Doxygen 风格(Lexer/Parser/Linker/Typecheck/Project/MachineConfig/TypeInfo/Codec/Codegen/Stb/main 共 21 个文件)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user