structure of typedef and constant of #define can be solve now.

This commit is contained in:
2025-07-04 13:46:24 +08:00
parent aadb2bf692
commit 3322c4cdda
11 changed files with 2059 additions and 688 deletions
+34
View File
@@ -0,0 +1,34 @@
#ifndef __CONFIG_HPP__
#define __CONFIG_HPP__
#define VARIABLE_NAME_LENGTH_MAX 100
#define ELEMENT_NAME_LENGTH_MAX 100
#define TYPE_NAME_LENGTH_MAX 100
#define A2L_TYPE_STR_LENGTH_MAX 100
#define A2L_LIMIT_STR_LENGTH_MAX 100
#define SEGMENT_BUFF_LENGTH 5000
// 输出文件默认前缀
#define OUTPUT_A2L_DEFAULT_PREFIX "[NEW]"
// 中间件尾缀
#define OUTPUT_MIDDLEWARE_SUFFIX ".middleware.txt"
// 相关识别串
const char measurement_begin[] = "/*Start_Measurements*/";
const char measurement_end[] = "/*End_Measurements*/";
const char calibration_begin[] = "/*Start_Calibration*/";
const char calibration_end[] = "/*End_Calibration*/";
const char typedef_begin[] = "/*Start_TypeDef*/";
const char typedef_end[] = "/*End_TypeDef*/";
const char a2l_module_end[] = "/end MODULE";
// 段输出标识串
const char auto_generated_measurement_start[] = "\r\n/*********** Start of auto generated measurement blocks ***********/\r\n\r\n";
const char auto_generated_measurement_end[] = "\r\n/*********** End of auto generated measurement blocks ***********/\r\n\r\n";
const char auto_generated_calibration_start[] = "\r\n/*********** Start of auto generated calibration blocks ***********/\r\n\r\n";
const char auto_generated_calibration_end[] = "\r\n/*********** End of auto generated calibration blocks ***********/\r\n\r\n";
#endif
+22
View File
@@ -0,0 +1,22 @@
#ifndef __CORE_FUNCTIONS_HPP__
#define __CORE_FUNCTIONS_HPP__
#include "Global_Variables.hpp"
#include "Config.hpp"
// 参数解析
void solve_args(int argc, char *argv[]);
// 解析宏定义
void solve_defines(void);
// 类型解析
void solve_types(void);
// 处理中间件
void solve_middleware(void);
// 处理最终A2L输出
void solve_A2L_output(void);
#endif
+25
View File
@@ -0,0 +1,25 @@
#ifndef __GLOBAL_VARIABLES_HPP__
#define __GLOBAL_VARIABLES_HPP__
#include "Type_Descriptions.hpp"
extern "C"
{
#include "stdio.h"
}
// 类型列表
extern type_node *type_list_head;
// 宏定义列表
extern define_node *define_list_head;
// 源文件列表
extern file_node *source_file_list_head;
// 文件指针
extern FILE *input_reference_A2L_file;
extern FILE *input_map_file;
extern FILE *output_target_A2L_file;
extern FILE *output_middleware_file;
#endif
+42
View File
@@ -0,0 +1,42 @@
#ifndef __TOOL_FUNCTIONS_HPP__
#define __TOOL_FUNCTIONS_HPP__
extern "C"
{
#include "stdint.h"
#include "stdio.h"
}
#include "Type_Descriptions.hpp"
// 读取文件一行行
error_type_enum f_getline(FILE *file, char *buffer, const size_t buffer_len, size_t *seek_len = nullptr);
// 读取下一个有效词组
error_type_enum f_getword(FILE *file, char *buffer, const size_t buffer_len, size_t *seek_len = nullptr);
// 获取文件代码行(以;为分界的代码逻辑行,忽略中途的注释)
error_type_enum f_get_codeline(FILE *file, char *buffer, const size_t buffer_len, size_t *seek_len = nullptr);
// 前进到下一行
size_t f_seek_nextline(FILE *file);
// 跳转到下一个非空字符
size_t f_seek_skip_blank(FILE *file);
// 基础变量类型解析
variable_type_enum get_variable_base_type(const char *str);
// 基础变量解析
variable_info solve_base_variable(const char *str);
// 解析变量类型
variable_type_enum get_variable_type(const char *str);
// 变量解析
variable_info solve_variable(const char *str);
// 日志输出
void print_log(log_type_enum log_type, const char *p_format_str, ...);
#endif
+91
View File
@@ -0,0 +1,91 @@
#ifndef __TYPE_DESCRIPTIONS_HPP__
#define __TYPE_DESCRIPTIONS_HPP__
extern "C"
{
#include "stdint.h"
}
#include "Config.hpp"
// 宏定义链表
typedef struct define_node_struct
{
char define_str[VARIABLE_NAME_LENGTH_MAX] = {'\0'}; // define 名串
char context_str[VARIABLE_NAME_LENGTH_MAX] = {'\0'}; // define 内容串
define_node_struct *p_next = nullptr;
} define_node;
// 文件链表
typedef struct file_node_struct
{
char *file_name_str = nullptr;
file_node_struct *p_next = nullptr;
} file_node;
// 错误类型枚举
typedef enum
{
ERROR_NONE, // 无错误
ERROR_OUT_OF_LENGTH, // 超出长度
ERROR_ILLEGAL_POINTER, // 非法指针
ERROR_ILLEGAL_WORD_SECTION, // 非法词段
ERROR_END_OF_FILE, // 文件结尾
} error_type_enum;
// 变量类型枚举
typedef enum
{
TYPE_UNKNOWN, // 未知类型
TYPE_NOT_SUPPORTED, // 不支持的类型
STRUCTURE, // 结构体类型
UBYTE, // uint8_t,bool
UWORD, // uint16_t
ULONG, // uint32_t
SBYTE, // int8_t
SWORD, // int16_t
SLONG, // int32_t
FLOAT32, // float
FLOAT64, // double
} variable_type_enum;
// 变量信息结构体
typedef struct
{
char name_str[VARIABLE_NAME_LENGTH_MAX] = {'\0'}; // 变量名
const char *type_name_str = nullptr; // 变量类型字符串
size_t element_count = 0; // 子元素计数(仅数组>1,单个变量该值为1)
size_t single_element_size = 0; // 单个子元素大小(单位字节)
uint32_t start_addr_32 = 0x00000000; // 变量起始地址(32位地址,4字节)
variable_type_enum type = TYPE_NOT_SUPPORTED; // 变量类型
char A2L_type_str[A2L_TYPE_STR_LENGTH_MAX] = {'\0'}; // 类型字符串
char A2L_max_limit_str[A2L_LIMIT_STR_LENGTH_MAX] = {'\0'}; // 上限字符串
char A2L_min_limit_str[A2L_LIMIT_STR_LENGTH_MAX] = {'\0'}; // 下限字符串
} variable_info;
// 元素信息记录链表
typedef struct sub_element_node_struct
{
variable_info element_info; // 元素信息
struct sub_element_node_struct *p_next = nullptr; // 链表指针
} sub_element_node;
// 复合类型记录链表
typedef struct type_node_struct
{
char type_name_str[TYPE_NAME_LENGTH_MAX] = {'\0'}; // 类型名
sub_element_node *element_list_head = nullptr; // 子成员链表
variable_type_enum type = TYPE_UNKNOWN; // 类型标记
struct type_node_struct *p_next = nullptr; // 链表指针
} type_node;
// 日志类型记录
typedef enum
{
LOG_NORMAL, // 常规类型
LOG_SUCCESS, // 成功类型
LOG_FAILURE, // 失败类型
LOG_ERROR, // 错误类型
LOG_WARN, // 警告类型
} log_type_enum;
#endif