MtFmt 1.0.0
MtFmt is a format library on embed. system and wrote by pure C.
载入中...
搜索中...
未找到
结构体 | 宏定义 | 类型定义 | 枚举 | 函数 | 变量
mm_parser.c 文件参考

formatter parser实现 更多...

#include "mm_parser.h"

结构体

struct  tagToken
 TOKEN结构 更多...
 
struct  tagMStrFmtParserState
 分析器状态 更多...
 

宏定义

#define MSTR_IMP_SOURCES   1
 
#define LEX_PEEK_CHAR(pstr)   (*(pstr))
 peek一个字符
 
#define LEX_MOVE_TO_NEXT(pstr)
 move到下一个字符的位置
 
#define LEX_ACCEPT_TOKEN(tk, typ, at_pstr)
 ACCEPT一个token, 注意这个macro不会跳转
 
#define IS_NUMBER(ch)   ((ch) >= '0' && (ch) <= '9')
 判断是否为一个number
 
#define LEX_CURRENT_TOKEN(ps)   ((ps)->token)
 取得当前Token
 
#define PARSER_STAGE_BEGIN(s, new_s)    ((ParserStage)((uint32_t)(s) | (uint32_t)(new_s)))
 表示一个stage开始
 
#define PARSER_STAGE_END(s, new_s)    ((ParserStage)((uint32_t)(s) & ~(uint32_t)(new_s)))
 表示一个stage结束
 
#define IS_CHRONO_TOKEN_TYPE(type)
 判断是否为Chrono格式化需要的token
 
#define IS_CHRONO_USERDEF_TOKEN_TYPE(type)
 判断是否为Chrono格式化需要的用户自定义token
 

类型定义

typedef enum tagTokenType TokenType
 Token的类型
 
typedef struct tagToken Token
 TOKEN结构
 
typedef enum tagParserStage ParserStage
 表示parser的各个stage
 

枚举

enum  tagTokenType {
  TokenType_EOF , TokenType_Gt , TokenType_Lt , TokenType_Equ ,
  TokenType_Colon , TokenType_VlineColon , TokenType_Type_Int8 , TokenType_Type_Int16 ,
  TokenType_Type_Int32 , TokenType_Type_Uint8 , TokenType_Type_Uint16 , TokenType_Type_Uint32 ,
  TokenType_Type_IFixedNumber , TokenType_Type_UFixedNumber , TokenType_Type_IQuant , TokenType_Type_UQuant ,
  TokenType_Type_Floating32 , TokenType_Type_Floating64 , TokenType_Type_CString , TokenType_Type_SysTime ,
  TokenType_LeftBrace , TokenType_RightBrace , TokenType_LeftBraceBracket , TokenType_RightBracketBrace ,
  TokenType_LeftBraceBrace , TokenType_RightBraceBrace , TokenType_Digits , TokenType_Flag_ChronoBegin ,
  TokenType_ChronoPredef_f , TokenType_ChronoPredef_g , TokenType_Flag_ChronoUserdefBegin , TokenType_Chrono_Year_1 ,
  TokenType_Chrono_Year_Fixed2 , TokenType_Chrono_Year_3 , TokenType_Chrono_Year_Fixed4 , TokenType_Chrono_Month_1 ,
  TokenType_Chrono_Month_Fixed2 , TokenType_Chrono_Day_1 , TokenType_Chrono_Day_Fixed2 , TokenType_Chrono_Hour_1 ,
  TokenType_Chrono_Hour_Fixed2 , TokenType_Chrono_Hour24_1 , TokenType_Chrono_Hour24_Fixed2 , TokenType_Chrono_Minute_1 ,
  TokenType_Chrono_Minute_Fixed2 , TokenType_Chrono_Second_1 , TokenType_Chrono_Second_Fixed2 , TokenType_Chrono_SubSecond_Fixed1 ,
  TokenType_Chrono_SubSecond_Fixed2 , TokenType_Chrono_SubSecond_Fixed3 , TokenType_Chrono_SubSecond_Fixed4 , TokenType_Chrono_WeekName ,
  TokenType_Flag_ChronoEnd , TokenType_OtherChar
}
 Token的类型 更多...
 
enum  tagParserStage { ParserStage_Normal = 0x00 , ParserStage_NeedEnd = 0x01 , ParserStage_MatchChronoToken = 0x02 }
 表示parser的各个stage 更多...
 

函数

static mstr_result_t parse_replacement_field (MStrFmtParserState *state, MStrFmtParseResult *parser_result)
 解析 replacement_field
 
static mstr_result_t parse_array_field (MStrFmtParserState *state, MStrFmtParseResult *parser_result)
 解析 数组变量的格式化标记
 
static mstr_result_t parse_opt_split_chars (MStrFmtParserState *state, const char **ppbeg, const char **ppend)
 解析可选的split char
 
static mstr_result_t parse_split_chars (MStrFmtParserState *state, const char **ppbeg, const char **ppend)
 解析split chars
 
static mstr_result_t parse_simple_field (MStrFmtParserState *state, MStrFmtParseResult *parser_result)
 解析 单个变量的格式化标记
 
static mstr_result_t parse_opt_formatfield_spec (MStrFmtParserState *state, MStrFmtArgType arg_type, MStrFmtFormatDescript *spec)
 解析可选的格式化描述: : [format_spec | chrono_spec]
 
static mstr_result_t parse_opt_format_chrono_spec (MStrFmtParserState *state, MStrFmtFormatSpec *spec)
 解析格式化的方式 [format_spec | chrono_spec]
 
static mstr_result_t parse_format_spec (MStrFmtParserState *state, MStrFmtFormatSpec *spec)
 解析一般的值格式化的方式(format_spec)
 
static mstr_result_t parse_chrono_spec (MStrFmtParserState *state, MStrFmtFormatSpec *spec)
 解析时间日期的值格式化的方式(chrono_spec)
 
static mstr_result_t parse_chrono_spec_item (MStrFmtParserState *state, MStrFmtChronoItemFormatSpec *item)
 解析时间日期的值格式化的方式项
 
static mstr_result_t parse_opt_width (MStrFmtParserState *state, int32_t *width)
 解析可选的宽度, 默认为-1
 
static mstr_result_t parse_opt_sign (MStrFmtParserState *state, MStrFmtSignDisplay *disp)
 指定符号的显示方式
 
static mstr_result_t parse_opt_items (MStrFmtParserState *state, char *ch, MStrFmtAlign *align, MStrFmtFormatSpec *spec, MStrFmtSignDisplay *sign)
 解析可选的fill char或者format type
 
static mstr_result_t parse_align (MStrFmtParserState *state, MStrFmtAlign *align)
 解析align
 
static mstr_result_t parse_arg_id (MStrFmtParserState *state, uint32_t *arg_id)
 解析arg_id
 
static mstr_result_t parse_arg_type (MStrFmtParserState *state, MStrFmtArgType *arg_type, MStrFmtArgProperty *arg_prop)
 解析格式化的值类型
 
static void parse_arg_get_fixed_props (const Token *token, MStrFmtArgProperty *arg_prop)
 解析定点数token里面的信息, 填充 MStrFmtArgProperty
 
static mstr_result_t parse_one_token (MStrFmtParserState *state, TokenType tk, mstr_result_t or_else)
 表示当前需要token类型 tk, 不然返回 or_else
 
static mstr_result_t parse_end_token (MStrFmtParserState *state, TokenType tk, mstr_result_t or_else)
 表示当前需要token类型 tk, 不然返回 or_else
 
static mstr_result_t parser_next_token (MStrFmtParserState *state)
 取得下一个token
 
static mstr_result_t parser_peek_token (Token *token, MStrFmtParserState *state)
 尝试看看下一个token
 
static mstr_result_t lex_next_token (Token *token, const char *str, usize_t offset, ParserStage stage)
 取得下一个token
 
static uint32_t lex_atou (const char *str, usize_t max_len)
 将字符串转为无符号整数值
 
 mstr_fmt_parser_init (byte_t *mem, const char *inp, MStrFmtParserState **ppstate)
 初始化Parser状态
 
 mstr_fmt_parse_goal (MStrFmtParserState *state, MStrFmtParseResult *result)
 解析 replacement field
 
 mstr_fmt_parser_end_position (MStrFmtParserState *state, const char *pbeg)
 计算parser停止的位置
 

变量

static const char *const MFMT_DEFAULT_SPLIT = ", "
 默认的array split
 
static const usize_t MFMT_DEFAULT_SPLIT_LENGTH = 2
 
static const char *const MFMT_DEFAULT_CHRONO_DATE_SPLIT = "-"
 默认的年月日之间的分割
 
static const usize_t MFMT_DEFAULT_CHRONO_DATE_SPLIT_LENGTH = 1
 
static const char *const MFMT_DEFAULT_CHRONO_TIME_SPLIT = ":"
 默认的时分秒之间的分割
 
static const usize_t MFMT_DEFAULT_CHRONO_TIME_SPLIT_LENGTH = 1
 
static const char *const MFMT_DEFAULT_CHRONO_ITEM_SPLIT = " "
 默认的时间日期项之间的分割
 
static const usize_t MFMT_DEFAULT_CHRONO_ITEM_SPLIT_LENGTH = 1
 
static const char *const MFMT_DEFAULT_CHRONO_SUBSEC_SPLIT = "."
 默认的毫秒项之间的分割
 
static const usize_t MFMT_DEFAULT_CHRONO_SUBSEC_SPLIT_LENGTH = 1
 

详细描述

formatter parser实现

作者
向阳 (hinat.nosp@m.a.ho.nosp@m.shino.nosp@m.@fox.nosp@m.mail..nosp@m.com)
版本
1.0
日期
2023-03-21

宏定义说明

◆ IS_CHRONO_TOKEN_TYPE

#define IS_CHRONO_TOKEN_TYPE (   type)
值:
((uint32_t)(type) > (uint32_t)TokenType_Flag_ChronoBegin && \
(uint32_t)(type) < (uint32_t)TokenType_Flag_ChronoEnd)
@ TokenType_Flag_ChronoEnd
结束: Chrono相关的token
Definition mm_parser.c:220
@ TokenType_Flag_ChronoBegin
开始: Chrono相关的token
Definition mm_parser.c:145

判断是否为Chrono格式化需要的token

◆ IS_CHRONO_USERDEF_TOKEN_TYPE

#define IS_CHRONO_USERDEF_TOKEN_TYPE (   type)
值:
((uint32_t)(type) > (uint32_t)TokenType_Flag_ChronoUserdefBegin && \
(uint32_t)(type) < (uint32_t)TokenType_Flag_ChronoEnd)
@ TokenType_Flag_ChronoUserdefBegin
开始: Chrono相关的userdef token
Definition mm_parser.c:154

判断是否为Chrono格式化需要的用户自定义token

◆ IS_NUMBER

#define IS_NUMBER (   ch)    ((ch) >= '0' && (ch) <= '9')

判断是否为一个number

◆ LEX_ACCEPT_TOKEN

#define LEX_ACCEPT_TOKEN (   tk,
  typ,
  at_pstr 
)
值:
do { \
(tk)->type = (typ); \
(tk)->len = (usize_t)((at_pstr) - (tk)->beg); \
} while (0)
size_t usize_t
尺寸(无符号)
Definition mm_type.h:32

ACCEPT一个token, 注意这个macro不会跳转

◆ LEX_CURRENT_TOKEN

#define LEX_CURRENT_TOKEN (   ps)    ((ps)->token)

取得当前Token

◆ LEX_MOVE_TO_NEXT

#define LEX_MOVE_TO_NEXT (   pstr)
值:
do { \
(pstr) += 1; \
} while (0)

move到下一个字符的位置

◆ LEX_PEEK_CHAR

#define LEX_PEEK_CHAR (   pstr)    (*(pstr))

peek一个字符

◆ MSTR_IMP_SOURCES

#define MSTR_IMP_SOURCES   1

◆ PARSER_STAGE_BEGIN

#define PARSER_STAGE_BEGIN (   s,
  new_s 
)     ((ParserStage)((uint32_t)(s) | (uint32_t)(new_s)))

表示一个stage开始

◆ PARSER_STAGE_END

#define PARSER_STAGE_END (   s,
  new_s 
)     ((ParserStage)((uint32_t)(s) & ~(uint32_t)(new_s)))

表示一个stage结束

类型定义说明

◆ ParserStage

表示parser的各个stage

注解
该enum指定了parser stage, 好影响lex识别内容的倾向 ( 屑死了 o( ̄▽ ̄)o )

◆ Token

typedef struct tagToken Token

TOKEN结构

◆ TokenType

typedef enum tagTokenType TokenType

Token的类型

枚举类型说明

◆ tagParserStage

表示parser的各个stage

注解
该enum指定了parser stage, 好影响lex识别内容的倾向 ( 屑死了 o( ̄▽ ̄)o )
枚举值
ParserStage_Normal 

当前parser在normal状态

ParserStage_NeedEnd 

表示parser期望一个End的结束符号( } 或者 ]} )

ParserStage_MatchChronoToken 

表示parser期望对chrono的格式化内容进行解析

◆ tagTokenType

Token的类型

枚举值
TokenType_EOF 

'\0'

TokenType_Gt 

'>'

TokenType_Lt 

'<'

TokenType_Equ 

'='

TokenType_Colon 

':'

TokenType_VlineColon 

'|:'

TokenType_Type_Int8 

':i8'

TokenType_Type_Int16 

':i16'

TokenType_Type_Int32 

':i32'

TokenType_Type_Uint8 

':u8'

TokenType_Type_Uint16 

':u16'

TokenType_Type_Uint32 

':u32'

TokenType_Type_IFixedNumber 

'FXX.XXX'

TokenType_Type_UFixedNumber 

'FXX.XXXu'

TokenType_Type_IQuant 

'qXX'

TokenType_Type_UQuant 

'qXXu'

TokenType_Type_Floating32 

f32

TokenType_Type_Floating64 

f64

TokenType_Type_CString 

':s'

TokenType_Type_SysTime 

':t'

TokenType_LeftBrace 

'{'

TokenType_RightBrace 

'}'

TokenType_LeftBraceBracket 

'{['

TokenType_RightBracketBrace 

']}'

TokenType_LeftBraceBrace 

'{{'

TokenType_RightBraceBrace 

'}}'

TokenType_Digits 

[0-9] +

TokenType_Flag_ChronoBegin 

开始: Chrono相关的token

TokenType_ChronoPredef_f 

Chrono: f

TokenType_ChronoPredef_g 

Chrono: g

TokenType_Flag_ChronoUserdefBegin 

开始: Chrono相关的userdef token

TokenType_Chrono_Year_1 

Chrono: 年份, 1 ~ 2位

TokenType_Chrono_Year_Fixed2 

Chrono: 年份, 2位, 不足补0

TokenType_Chrono_Year_3 

Chrono: 年份, 3位或者4位, 不足补0

TokenType_Chrono_Year_Fixed4 

Chrono: 年份, 4位, 不足补0

TokenType_Chrono_Month_1 

Chrono: 月份, 1 ~ 2位

TokenType_Chrono_Month_Fixed2 

Chrono: 月份, 2位, 不足补0

TokenType_Chrono_Day_1 

Chrono: 天数, 1 ~ 2位

TokenType_Chrono_Day_Fixed2 

Chrono: 天数, 2位, 不足补0

TokenType_Chrono_Hour_1 

Chrono: 小时, 1 ~ 2位

TokenType_Chrono_Hour_Fixed2 

Chrono: 小时, 2位, 不足补0

TokenType_Chrono_Hour24_1 

Chrono: 小时(24 hour), 1 ~ 2位

TokenType_Chrono_Hour24_Fixed2 

Chrono: 小时(24 hour), 2位, 不足补0

TokenType_Chrono_Minute_1 

Chrono: 分钟, 1 ~ 2位

TokenType_Chrono_Minute_Fixed2 

Chrono: 分钟, 2位, 不足补0

TokenType_Chrono_Second_1 

Chrono: 秒, 1 ~ 2位

TokenType_Chrono_Second_Fixed2 

Chrono: 秒, 2位, 不足补0

TokenType_Chrono_SubSecond_Fixed1 

Chrono: 子秒, 1位

TokenType_Chrono_SubSecond_Fixed2 

Chrono: 子秒, 2位

TokenType_Chrono_SubSecond_Fixed3 

Chrono: 子秒, 3位

TokenType_Chrono_SubSecond_Fixed4 

Chrono: 子秒, 4位

TokenType_Chrono_WeekName 

Chrono: 星期 (full name)

TokenType_Flag_ChronoEnd 

结束: Chrono相关的token

TokenType_OtherChar 

其它没有被定义的字符

函数说明

◆ lex_atou()

static uint32_t lex_atou ( const char *  str,
usize_t  max_len 
)
static

将字符串转为无符号整数值

参数
str字符串
max_len最大读取的字符串长度
返回
uint32_t: 转换结果
注意
该函数假设值不超过u32

◆ lex_next_token()

static mstr_result_t lex_next_token ( Token token,
const char *  str,
usize_t  offset,
ParserStage  stage 
)
static

取得下一个token

参数
[out]tokenToken输出
[in]str输入字符串, 会取得最前面的token
[in]offset输入str的偏移位置
[in]stage这个值可以告诉lex, parser希望尝试识别什么样的token
返回
mstr_result_t: 解析结果

◆ mstr_fmt_parse_goal()

mstr_fmt_parse_goal ( MStrFmtParserState state,
MStrFmtParseResult result 
)

解析 replacement field

参数
[in,out]stateParser状态
[out]resultParser结果
返回
mstr_result_t: parser结果

◆ mstr_fmt_parser_end_position()

mstr_fmt_parser_end_position ( MStrFmtParserState state,
const char *  pbeg 
)

计算parser停止的位置

参数
stateparser状态
pbegparser init时候传进去的inp指针

◆ mstr_fmt_parser_init()

mstr_fmt_parser_init ( byte_t mem,
const char *  inp,
MStrFmtParserState **  ppstate 
)

初始化Parser状态

参数
[in]mem内存, 大小需要至少比 sizeof(MStrFmtParserState) 大
[in]inp输入字符串
[out]ppstate解析状态
注解
使用macro MFMT_PARSER_STATE_SIZE 来帮助解决 mem 的大小问题

◆ parse_align()

static mstr_result_t parse_align ( MStrFmtParserState state,
MStrFmtAlign align 
)
static

解析align

注意
该函数不指定默认值

◆ parse_arg_get_fixed_props()

static void parse_arg_get_fixed_props ( const Token token,
MStrFmtArgProperty arg_prop 
)
static

解析定点数token里面的信息, 填充 MStrFmtArgProperty

注解
因为Token正确时其绝对是succ, 因此返回类型为void

◆ parse_arg_id()

static mstr_result_t parse_arg_id ( MStrFmtParserState state,
uint32_t *  arg_id 
)
static

解析arg_id

◆ parse_arg_type()

static mstr_result_t parse_arg_type ( MStrFmtParserState state,
MStrFmtArgType arg_type,
MStrFmtArgProperty arg_prop 
)
static

解析格式化的值类型

◆ parse_array_field()

static mstr_result_t parse_array_field ( MStrFmtParserState state,
MStrFmtParseResult parser_result 
)
static

解析 数组变量的格式化标记

◆ parse_chrono_spec()

static mstr_result_t parse_chrono_spec ( MStrFmtParserState state,
MStrFmtFormatSpec spec 
)
static

解析时间日期的值格式化的方式(chrono_spec)

◆ parse_chrono_spec_item()

static mstr_result_t parse_chrono_spec_item ( MStrFmtParserState state,
MStrFmtChronoItemFormatSpec item 
)
static

解析时间日期的值格式化的方式项

◆ parse_end_token()

static mstr_result_t parse_end_token ( MStrFmtParserState state,
TokenType  tk,
mstr_result_t  or_else 
)
static

表示当前需要token类型 tk, 不然返回 or_else

注意
这个东东有正确的结束字符处理, 在Goal的末尾用这个, 这样能给出正确的offset

◆ parse_format_spec()

static mstr_result_t parse_format_spec ( MStrFmtParserState state,
MStrFmtFormatSpec spec 
)
static

解析一般的值格式化的方式(format_spec)

◆ parse_one_token()

static mstr_result_t parse_one_token ( MStrFmtParserState state,
TokenType  tk,
mstr_result_t  or_else 
)
static

表示当前需要token类型 tk, 不然返回 or_else

注意
这个东东没有正确的结束字符处理, 不要在Goal的末尾用这个

◆ parse_opt_format_chrono_spec()

static mstr_result_t parse_opt_format_chrono_spec ( MStrFmtParserState state,
MStrFmtFormatSpec spec 
)
static

解析格式化的方式 [format_spec | chrono_spec]

注解
这个东东被设计为上下文相关的, 会匹配有关的字符, 尽管它们不在lex里面
注意
该函数不设置默认值

◆ parse_opt_formatfield_spec()

static mstr_result_t parse_opt_formatfield_spec ( MStrFmtParserState state,
MStrFmtArgType  arg_type,
MStrFmtFormatDescript spec 
)
static

解析可选的格式化描述: : [format_spec | chrono_spec]

◆ parse_opt_items()

static mstr_result_t parse_opt_items ( MStrFmtParserState state,
char *  ch,
MStrFmtAlign align,
MStrFmtFormatSpec spec,
MStrFmtSignDisplay sign 
)
static

解析可选的fill char或者format type

注解
因为fill char的后面其实除了[0-9], ], }, |都可以, 因此它识别了一大堆的token
注意
该函数不设置默认值

◆ parse_opt_sign()

static mstr_result_t parse_opt_sign ( MStrFmtParserState state,
MStrFmtSignDisplay disp 
)
static

指定符号的显示方式

注解
这个东东被设计为上下文相关的, 会匹配'+', '-', ' ', 尽管它们不在lex里面
注意
该函数不设置默认值

◆ parse_opt_split_chars()

static mstr_result_t parse_opt_split_chars ( MStrFmtParserState state,
const char **  ppbeg,
const char **  ppend 
)
static

解析可选的split char

◆ parse_opt_width()

static mstr_result_t parse_opt_width ( MStrFmtParserState state,
int32_t *  width 
)
static

解析可选的宽度, 默认为-1

注意
该函数不设置默认值

◆ parse_replacement_field()

static mstr_result_t parse_replacement_field ( MStrFmtParserState state,
MStrFmtParseResult parser_result 
)
static

解析 replacement_field

◆ parse_simple_field()

static mstr_result_t parse_simple_field ( MStrFmtParserState state,
MStrFmtParseResult parser_result 
)
static

解析 单个变量的格式化标记

◆ parse_split_chars()

static mstr_result_t parse_split_chars ( MStrFmtParserState state,
const char **  ppbeg,
const char **  ppend 
)
static

解析split chars

◆ parser_next_token()

static mstr_result_t parser_next_token ( MStrFmtParserState state)
static

取得下一个token

参数
[in,out]state分析器状态

◆ parser_peek_token()

static mstr_result_t parser_peek_token ( Token token,
MStrFmtParserState state 
)
static

尝试看看下一个token

参数
[in,out]state分析器状态

变量说明

◆ MFMT_DEFAULT_CHRONO_DATE_SPLIT

const char* const MFMT_DEFAULT_CHRONO_DATE_SPLIT = "-"
static

默认的年月日之间的分割

◆ MFMT_DEFAULT_CHRONO_DATE_SPLIT_LENGTH

const usize_t MFMT_DEFAULT_CHRONO_DATE_SPLIT_LENGTH = 1
static

◆ MFMT_DEFAULT_CHRONO_ITEM_SPLIT

const char* const MFMT_DEFAULT_CHRONO_ITEM_SPLIT = " "
static

默认的时间日期项之间的分割

◆ MFMT_DEFAULT_CHRONO_ITEM_SPLIT_LENGTH

const usize_t MFMT_DEFAULT_CHRONO_ITEM_SPLIT_LENGTH = 1
static

◆ MFMT_DEFAULT_CHRONO_SUBSEC_SPLIT

const char* const MFMT_DEFAULT_CHRONO_SUBSEC_SPLIT = "."
static

默认的毫秒项之间的分割

◆ MFMT_DEFAULT_CHRONO_SUBSEC_SPLIT_LENGTH

const usize_t MFMT_DEFAULT_CHRONO_SUBSEC_SPLIT_LENGTH = 1
static

◆ MFMT_DEFAULT_CHRONO_TIME_SPLIT

const char* const MFMT_DEFAULT_CHRONO_TIME_SPLIT = ":"
static

默认的时分秒之间的分割

◆ MFMT_DEFAULT_CHRONO_TIME_SPLIT_LENGTH

const usize_t MFMT_DEFAULT_CHRONO_TIME_SPLIT_LENGTH = 1
static

◆ MFMT_DEFAULT_SPLIT

const char* const MFMT_DEFAULT_SPLIT = ", "
static

默认的array split

◆ MFMT_DEFAULT_SPLIT_LENGTH

const usize_t MFMT_DEFAULT_SPLIT_LENGTH = 2
static