2.2.4 其他符号解析逻辑
2.2.4.1 单行注释
对于 #
开头的单行注释,解析逻辑如下:
MY_LEX_START
:初始状态,遇到#
时,通过state_map
映射,将自动机状态置为MY_LEX_COMMENT
。MY_LEX_COMMENT
:匹配换行符以外的其他字符,直至遇到换行符或输入流结束,跳过这段字符,并将自动机状态置为MY_LEX_START
,继续尝试匹配语法元素。
对于 -
开头的单行注释,解析逻辑如下:
MY_LEX_START
:初始状态,遇到-
时,通过state_map
映射,将自动机状态置为MY_LEX_CHAR
。MY_LEX_CHAR
:如果上一个字符是-
、当前字符是-
且下一个字符是空格,则将自动机状态置为MY_LEX_COMMENT
。MY_LEX_COMMENT
:匹配换行符以外的其他字符,直至遇到换行符或输入流结束,跳过这段字符,并将自动机状态置为MY_LEX_START
,继续尝试匹配语法元素。
2.2.4.2 括号、逗号、问号
对于 (
、)
、{
、}
、,
和 ?
,解析逻辑如下:
MY_LEX_START
:初始状态,遇到(
、)
、{
、}
、,
或?
时,通过state_map
映射,将自动机状态置为MY_LEX_CHAR
。MY_LEX_CHAR
:返回当前字符值作为 Token 类型,如果是?
且为预编译模式则返回 Token 类型PARAM_MARKER
。
2.2.4.3 分号
对于 ;
,解析逻辑如下:
MY_LEX_START
:初始状态,遇到;
时,通过state_map
映射,将自动机状态置为MY_LEX_SEMICOLON
。MY_LEX_SEMICOLON
:将自动机状态置为MY_LEX_CHAR
。MY_LEX_CHAR
:返回当前字符值作为 Token 类型。
2.2.4.4 引用系统变量
对于 @@
开头的引用系统变量,解析逻辑如下:
MY_LEX_START
:初始状态,遇到@
时,通过state_map
映射,将自动机状态置为MY_LEX_USER_END
。MY_LEX_USER_END
:产出@
类型 Token,验证下一个字符是@
,则将自动机状态置为MY_LEX_SYSTEM_VAR
。MY_LEX_SYSTEM_VAR
:产出@
类型 Token,验证下一个字符不是反引号,然后将自动机状态置为MY_LEX_IDENT_OR_KEYWORD
。MY_LEX_IDENT_OR_KEYWORD
:不断匹配数字、字母、多字节字符、下划线直至遇到其他字符- 如果没有匹配到任何字符,返回
ABORT_SYM
类型 Token 以抛出异常; - 如果匹配的部分为关键字,则返回关键字对应的 Token 类型;
- 如果匹配的部分不是关键字,则返回标识符类型。
- 如果没有匹配到任何字符,返回
2.2.4.4 @
开头的语法元素
对于 @
开头的语法元素,解析逻辑如下:
MY_LEX_START
:初始状态,遇到@
时,通过state_map
映射,将自动机状态置为MY_LEX_USER_END
。MY_LEX_USER_END
:产出@
类型 Token,验证下一个字符不是单引号、反引号、双引号或@
,则将自动机状态置为MY_LEX_HOSTNAME
。MY_LEX_HOSTNAME
:不断匹配数字、.
、_
和$
直至遇到其他字符,返回LEX_HOSTNAME
类型。
2.2.4.5 反引号标识符
对于反引号框柱的标识符,解析逻辑如下:
LEX_START
:初始状态,遇到反引号时,通过state_map
映射,将自动机状态置为MY_LEX_USER_VARIABLE_DELIMITER
。MY_LEX_USER_VARIABLE_DELIMITER
:不断匹配字符直至遇到下一个反引号,返回IDENT_QUOTED
类型。
如果 sql_mode
开启了 MODE_ANSI_QUOTES
,则支持双引号标识符,其解析逻辑如下:
LEX_START
:初始状态,遇到双引号时,通过state_map
映射,将自动机状态置为MY_LEX_STRING_OR_DELIMITER
。MY_LEX_STRING_OR_DELIMITER
:验证 sql_mode 开启了MODE_ANSI_QUOTES
,则将自动机状态置为MY_LEX_USER_VARIABLE_DELIMITER
。MY_LEX_USER_VARIABLE_DELIMITER
:不断匹配字符直至遇到下一个反引号,返回IDENT_QUOTED
类型。
2.2.4.6 $
开头的标识符
对于 $
开头的标识符,接续逻辑如下:
LEX_START
:初始状态,遇到$
时,通过state_map
映射,将自动机状态置为MY_LEX_IDENT
。MY_LEX_IDENT
:将$
视作普通字符,继续匹配标识符的其余部分,并返回标识符类型。