MySQL 源码|108 - 词法解析:状态转移逻辑(其他符号)

MySQL 词法解析:其他符号状态转移逻辑

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:将 $ 视作普通字符,继续匹配标识符的其余部分,并返回标识符类型。
### 词法分析器设计步骤 词法分析器的核心任务是从输入的字符流中提取出具有独立意义的最小语法单位(即单词符号)。以下是基于已有引用内容和专业知识总结的词法分析器设计步骤: #### 输入处理阶段 词法分析器接收由字符组成的输入流,并对其进行初步过滤。此过程通常包括去除无意义的空白字符、换行符以及注释等内容[^4]。 #### 字符串匹配阶段 在此阶段,词法分析器依据定义好的词法规则集逐一尝试匹配输入字符串中的模式。这些规则可以采用正则表达式的形式表示,以便高效地捕获各种类型的令牌(token),如关键字、标识符、常量、运算符等[^2]。 #### 符号分类与标注 一旦成功匹配某个特定模式,则该部分被认定为一个有效的词法单元,并赋予相应的类别标签(例如,“if”会被标记为关键字;变量名可能被标记为标识符)[^3]。 #### 输出生成阶段 最终结果是以一系列有序排列并带有语义信息的词法单元形式呈现出来给后续阶段——通常是语法分析模块使用[^1]。 下面给出一段伪代码展示基本框架: ```python def lexical_analyzer(input_stream): tokens = [] while not end_of_input(input_stream): current_char = get_next_character(input_stream) if is_whitespace(current_char): skip_whitespaces() elif matches_keyword_rule(current_char): add_token_to_list(tokens, classify_as_keyword()) elif matches_identifier_rule(current_char): add_token_to_list(tokens, classify_as_identifier()) ... return tokens ``` ### 流程图概述 对于可视化描述整个工作流程而言,绘制一张清晰明了的流程图是非常有益处的。它应该涵盖以下几个方面: - 开始节点:启动程序运行状态; - 数据流入路径:显示原始数据进入系统的入口位置及其流向说明; - 处理环节:详尽描绘每一个必要的计算或者判断动作发生地点; - 结果导出路向:指明经过处理后的产物离开系统的方式方法; - 终止结点:标明正常结束情形下的退出状况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值