 MoonBit月兔编程语言 现代编程思想 第十一课 案例:语法解析器与Tagless Final	转化为抽象语法树 Division(Multiply(Add(Value(1), Value(5)), Value(7)), Value(2)) 计算最终结果:21 语法分析 对输⼊⽂本进⾏分析并确定其语法结构 通常包含词法分析和语法分析 本节课均利⽤语法解析器组合⼦(parser combinator)为例 2 词法分析 将输⼊分割为单词 输⼊:字符串/字节块 输出:单词流 例如: parse("-10123-+-523 103 ( 5) ) ")) 8. } 我们成功地分割了字符串 - 10123 - + - 523 103 ( 5 ) ) 但这不符合数学表达式的语法 13 语法分析 对单词流进⾏分析,判断是否符合语法 输⼊:单词流 输出:抽象语法树 1. expression = Value / "(" expression ")" 2. expression =/ "*" expression / expression "/" expression 1 + - 1 5 1 + (1 - 5) * - 5 1 5 (1 - 5) * 5 14 语法分析 语法定义 1. expression = Value / "(" expression ")" 2. expression =/ expression "+" expression / expression0 码力 | 25 页 | 400.29 KB | 1 年前3 MoonBit月兔编程语言 现代编程思想 第十一课 案例:语法解析器与Tagless Final	转化为抽象语法树 Division(Multiply(Add(Value(1), Value(5)), Value(7)), Value(2)) 计算最终结果:21 语法分析 对输⼊⽂本进⾏分析并确定其语法结构 通常包含词法分析和语法分析 本节课均利⽤语法解析器组合⼦(parser combinator)为例 2 词法分析 将输⼊分割为单词 输⼊:字符串/字节块 输出:单词流 例如: parse("-10123-+-523 103 ( 5) ) ")) 8. } 我们成功地分割了字符串 - 10123 - + - 523 103 ( 5 ) ) 但这不符合数学表达式的语法 13 语法分析 对单词流进⾏分析,判断是否符合语法 输⼊:单词流 输出:抽象语法树 1. expression = Value / "(" expression ")" 2. expression =/ "*" expression / expression "/" expression 1 + - 1 5 1 + (1 - 5) * - 5 1 5 (1 - 5) * 5 14 语法分析 语法定义 1. expression = Value / "(" expression ")" 2. expression =/ expression "+" expression / expression0 码力 | 25 页 | 400.29 KB | 1 年前3
 庖丁解牛:华为云微服务工具解放开发者根据sql、日志、代码实现微服务拆分,并修改相关代码。 Huawei Confidential 7 微服务拆分工具-表自动分库 SQL 语句 SQL 语句 SQL 语句 … 语法分析 语法分析 语法分析 表关联分析 图切割+启 发式规则 Step1:提取系统所有SQL Step2:逐条根据SQL创建语法树 Step3:在每棵语法树上分析表的关联关系并汇集 成表关联关系加权图0 码力 | 14 页 | 1.54 MB | 1 年前3 庖丁解牛:华为云微服务工具解放开发者根据sql、日志、代码实现微服务拆分,并修改相关代码。 Huawei Confidential 7 微服务拆分工具-表自动分库 SQL 语句 SQL 语句 SQL 语句 … 语法分析 语法分析 语法分析 表关联分析 图切割+启 发式规则 Step1:提取系统所有SQL Step2:逐条根据SQL创建语法树 Step3:在每棵语法树上分析表的关联关系并汇集 成表关联关系加权图0 码力 | 14 页 | 1.54 MB | 1 年前3
 Nim 2.0.2 中文手册处理缩进的实现⽅式如下,词法分析器⽤前导空格数来解释随后的 Token,缩进不是独⽴的 Token,这个技巧使得 Nim 解析时只 需要预先检查 1 个 Token。 语法分析器使⽤⼀个缩进级别的堆栈:该堆栈由计算空格的整数组成,语法分析器在对应的策略位置查询缩进信息,⽽忽略其他 位置。 伪终结符 IND{>} 表示缩进相⽐堆栈顶部的条⽬包含更多的空格, IND{=} 表示缩进有相同的空格数, DED 具有相同的优先级 ` ( ) { } [ ] , ; [. .] {. .} (. .) [: 词法 本节列出了 Nim 的标准语法。语法分析器如何处理缩进问题,在词法分析⼀节有说明。 Nim 允许⽤户定义运算符。⼆元运算符有 11 个不同的优先级。 结合律 第⼀个字符为 ^ 的⼆元运算符是右结合,所有其他⼆元运算符是左结合。 只有合法的 Nim 标识 符才能作为模块名(所以对应的⽂件名是 identifier.nim )。 编译模块的算法如下: 递归地追随导⼊语句正常编译整个模块。 如果发现成环,只导⼊已经完成语法分析的(且被导出的)符号;如果遇到未知标识符就中⽌。 最好⽤⼀个例⼦来演示(译者注:代码⾥的注释描述了编译模块 A 时编译器的⾏为): Import 语句 在 import 关键字之后,可以有0 码力 | 127 页 | 7.05 MB | 1 年前3 Nim 2.0.2 中文手册处理缩进的实现⽅式如下,词法分析器⽤前导空格数来解释随后的 Token,缩进不是独⽴的 Token,这个技巧使得 Nim 解析时只 需要预先检查 1 个 Token。 语法分析器使⽤⼀个缩进级别的堆栈:该堆栈由计算空格的整数组成,语法分析器在对应的策略位置查询缩进信息,⽽忽略其他 位置。 伪终结符 IND{>} 表示缩进相⽐堆栈顶部的条⽬包含更多的空格, IND{=} 表示缩进有相同的空格数, DED 具有相同的优先级 ` ( ) { } [ ] , ; [. .] {. .} (. .) [: 词法 本节列出了 Nim 的标准语法。语法分析器如何处理缩进问题,在词法分析⼀节有说明。 Nim 允许⽤户定义运算符。⼆元运算符有 11 个不同的优先级。 结合律 第⼀个字符为 ^ 的⼆元运算符是右结合,所有其他⼆元运算符是左结合。 只有合法的 Nim 标识 符才能作为模块名(所以对应的⽂件名是 identifier.nim )。 编译模块的算法如下: 递归地追随导⼊语句正常编译整个模块。 如果发现成环,只导⼊已经完成语法分析的(且被导出的)符号;如果遇到未知标识符就中⽌。 最好⽤⼀个例⼦来演示(译者注:代码⾥的注释描述了编译模块 A 时编译器的⾏为): Import 语句 在 import 关键字之后,可以有0 码力 | 127 页 | 7.05 MB | 1 年前3
 Go 2 Generics? A (P)review的语法设计非常精巧,很难在程序中识别一个模板的声明, 此外还会对某些函数模板进行语法分析可能非常 难。[...] 最后 的模板语法被设计为: template Go 2 Generics? A (P)review的语法设计非常精巧,很难在程序中识别一个模板的声明, 此外还会对某些函数模板进行语法分析可能非常 难。[...] 最后 的模板语法被设计为: template- T& index(vector - & v, int i) { /*…*/ } 我也严肃的讨论过将返回值放在参数表之后 进而很好的解决语法分析问题, index - (vector - & v, int i) 但大部分人宁愿要一个关 键字来帮助识别模板,[...] 选择尖括号 <…> 而不是圆括号 (…),是因为用户发现这样更容易阅读,因为圆括号在 C/C++ 里已被过度使用。事实证明,使用圆括 号进行语法分析也并不困 难,但读者(reader)总是喜欢尖括号 <…>。』 ——"The Design 0 码力 | 41 页 | 770.62 KB | 1 年前3
 WAF - 是时候跟正则表达式说再见from’, give me a hand。 基于语义检测的WAF 输入是否有效代码 执行了什么动作 动作是否有危害 抽象攻击语义 基于语义检测的WAF—实现 用户输入 词法分析 语法分析 攻击语义检测 攻击语义抽象 基于语义检测的WAF—优缺点 运营成本低 高准确率 优点|缺点 应急 响应慢 语义抽象 依赖人 低漏报 开发成本很高 算法优化 WAF运营手段 • WAF安全水位 • WAF瓶颈 • payload的变化 Part 3 如何构建未来的WAF 基于深度学习构建WAF 思路:用深度学习的模型代替语义检测中的词法分析、语法分析。 用户输入 深度学习的攻击 语义检测模型 在线检测 攻击语义的深 度学习网络 攻击语义的深度学习网络 "前缀闭合" "代码语句" "后缀闭合" 攻击语义 一般攻击语义0 码力 | 24 页 | 1.66 MB | 1 年前3 WAF - 是时候跟正则表达式说再见from’, give me a hand。 基于语义检测的WAF 输入是否有效代码 执行了什么动作 动作是否有危害 抽象攻击语义 基于语义检测的WAF—实现 用户输入 词法分析 语法分析 攻击语义检测 攻击语义抽象 基于语义检测的WAF—优缺点 运营成本低 高准确率 优点|缺点 应急 响应慢 语义抽象 依赖人 低漏报 开发成本很高 算法优化 WAF运营手段 • WAF安全水位 • WAF瓶颈 • payload的变化 Part 3 如何构建未来的WAF 基于深度学习构建WAF 思路:用深度学习的模型代替语义检测中的词法分析、语法分析。 用户输入 深度学习的攻击 语义检测模型 在线检测 攻击语义的深 度学习网络 攻击语义的深度学习网络 "前缀闭合" "代码语句" "后缀闭合" 攻击语义 一般攻击语义0 码力 | 24 页 | 1.66 MB | 1 年前3
 make & Makefile. . . . . . . . . . . . . . . . make & Makefile . make 的工作原理 . . make通过读取一个Makefile文件,首先对该文件进行语法分析, 如果Makefile文件格式有误,则报错并退出执行; 如果输入的Makefile文件文法正确,make分析Makefile文件中描 述的目标 (Targets)和前提 (Prerequisites)的关系,并建立一颗非环0 码力 | 36 页 | 975.98 KB | 1 年前3 make & Makefile. . . . . . . . . . . . . . . . make & Makefile . make 的工作原理 . . make通过读取一个Makefile文件,首先对该文件进行语法分析, 如果Makefile文件格式有误,则报错并退出执行; 如果输入的Makefile文件文法正确,make分析Makefile文件中描 述的目标 (Targets)和前提 (Prerequisites)的关系,并建立一颗非环0 码力 | 36 页 | 975.98 KB | 1 年前3
 Python 标准库参考指南 3.6.15 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1105 21.10 urllib.robotparser —robots.txt 语法分析程序 . . . . . . . . . . . . . . . . . . . . . . . . . 1106 21.11 http —HTTP 模块 . . . . . . . . . . 和其他相关方法添加消息负载;或者通过解析一个电子邮件消息的序 列化表达来创建消息对象结构。 email 包提供了一个可以理解包含 MIME 文档在内的绝大多数电子邮件文档结构的标准语法分析程序。你 可以传递给语法分析程序一个字节串、字符串或者文件对象,语法分析程序会返回给你对应于该对象结构的 根EmailMessage 实例。对于简单的、非 MIME 的消息,这个根对象的负载很可能就是一个包含了该消息 文字内容的字符串。对于 消息,调用根对象的is_multipart() 方法会返回 True,其子项可以通 过负载操纵方法来进行访问,例如get_body()、iter_parts() 还有walk()。 事实上你可以使用的语法分析程序接口有两种: Parser API 和增量式的FeedParser API。当你的全部消 息内容都在内存当中,或者整个消息都保存在文件系统内的一个文件当中的时候,Parser API 非常有用。0 码力 | 1886 页 | 8.95 MB | 9 月前3 Python 标准库参考指南 3.6.15 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1105 21.10 urllib.robotparser —robots.txt 语法分析程序 . . . . . . . . . . . . . . . . . . . . . . . . . 1106 21.11 http —HTTP 模块 . . . . . . . . . . 和其他相关方法添加消息负载;或者通过解析一个电子邮件消息的序 列化表达来创建消息对象结构。 email 包提供了一个可以理解包含 MIME 文档在内的绝大多数电子邮件文档结构的标准语法分析程序。你 可以传递给语法分析程序一个字节串、字符串或者文件对象,语法分析程序会返回给你对应于该对象结构的 根EmailMessage 实例。对于简单的、非 MIME 的消息,这个根对象的负载很可能就是一个包含了该消息 文字内容的字符串。对于 消息,调用根对象的is_multipart() 方法会返回 True,其子项可以通 过负载操纵方法来进行访问,例如get_body()、iter_parts() 还有walk()。 事实上你可以使用的语法分析程序接口有两种: Parser API 和增量式的FeedParser API。当你的全部消 息内容都在内存当中,或者整个消息都保存在文件系统内的一个文件当中的时候,Parser API 非常有用。0 码力 | 1886 页 | 8.95 MB | 9 月前3
 Python 标准库参考指南 3.6.15 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1105 21.10 urllib.robotparser —robots.txt 语法分析程序 . . . . . . . . . . . . . . . . . . . . . . . . . 1106 21.11 http —HTTP 模块 . . . . . . . . . . 和其他相关方法添加消息负载;或者通过解析一个电子邮件消息的序 列化表达来创建消息对象结构。 email 包提供了一个可以理解包含 MIME 文档在内的绝大多数电子邮件文档结构的标准语法分析程序。你 可以传递给语法分析程序一个字节串、字符串或者文件对象,语法分析程序会返回给你对应于该对象结构的 根EmailMessage 实例。对于简单的、非 MIME 的消息,这个根对象的负载很可能就是一个包含了该消息 文字内容的字符串。对于 消息,调用根对象的is_multipart() 方法会返回 True,其子项可以通 过负载操纵方法来进行访问,例如get_body()、iter_parts() 还有walk()。 事实上你可以使用的语法分析程序接口有两种: Parser API 和增量式的FeedParser API。当你的全部消 息内容都在内存当中,或者整个消息都保存在文件系统内的一个文件当中的时候,Parser API 非常有用。0 码力 | 1886 页 | 8.95 MB | 9 月前3 Python 标准库参考指南 3.6.15 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1105 21.10 urllib.robotparser —robots.txt 语法分析程序 . . . . . . . . . . . . . . . . . . . . . . . . . 1106 21.11 http —HTTP 模块 . . . . . . . . . . 和其他相关方法添加消息负载;或者通过解析一个电子邮件消息的序 列化表达来创建消息对象结构。 email 包提供了一个可以理解包含 MIME 文档在内的绝大多数电子邮件文档结构的标准语法分析程序。你 可以传递给语法分析程序一个字节串、字符串或者文件对象,语法分析程序会返回给你对应于该对象结构的 根EmailMessage 实例。对于简单的、非 MIME 的消息,这个根对象的负载很可能就是一个包含了该消息 文字内容的字符串。对于 消息,调用根对象的is_multipart() 方法会返回 True,其子项可以通 过负载操纵方法来进行访问,例如get_body()、iter_parts() 还有walk()。 事实上你可以使用的语法分析程序接口有两种: Parser API 和增量式的FeedParser API。当你的全部消 息内容都在内存当中,或者整个消息都保存在文件系统内的一个文件当中的时候,Parser API 非常有用。0 码力 | 1886 页 | 8.95 MB | 9 月前3
 Python 标准库参考指南 3.8.20 . . . . . . . . . . . . . . . . . . . . . . . . . . 1222 21.10 urllib.robotparser --- robots.txt 语法分析程序 . . . . . . . . . . . . . . . . . . . . . . . . 1222 21.11 http --- HTTP 模块 . . . . . . . . . 和其他相关方法添加消息负载;或者通过解析一个电子邮件消息的序 列化表达来创建消息对象结构。 email 包提供了一个可以理解包含 MIME 文档在内的绝大多数电子邮件文档结构的标准语法分析程序。你 可以传递给语法分析程序一个字节串、字符串或者文件对象,语法分析程序会返回给你对应于该对象结构的 根EmailMessage 实例。对于简单的、非 MIME 的消息,这个根对象的负载很可能就是一个包含了该消息 文字内容的字符串。对于 消息,调用根对象的is_multipart() 方法会返回 True,其子项可以通 过负载操纵方法来进行访问,例如get_body()、iter_parts() 还有walk()。 事实上你可以使用的语法分析程序接口有两种: Parser API 和增量式的FeedParser API。当你的全部消 息内容都在内存当中,或者整个消息都保存在文件系统内的一个文件当中的时候,Parser API 非常有用。0 码力 | 2052 页 | 9.74 MB | 9 月前3 Python 标准库参考指南 3.8.20 . . . . . . . . . . . . . . . . . . . . . . . . . . 1222 21.10 urllib.robotparser --- robots.txt 语法分析程序 . . . . . . . . . . . . . . . . . . . . . . . . 1222 21.11 http --- HTTP 模块 . . . . . . . . . 和其他相关方法添加消息负载;或者通过解析一个电子邮件消息的序 列化表达来创建消息对象结构。 email 包提供了一个可以理解包含 MIME 文档在内的绝大多数电子邮件文档结构的标准语法分析程序。你 可以传递给语法分析程序一个字节串、字符串或者文件对象,语法分析程序会返回给你对应于该对象结构的 根EmailMessage 实例。对于简单的、非 MIME 的消息,这个根对象的负载很可能就是一个包含了该消息 文字内容的字符串。对于 消息,调用根对象的is_multipart() 方法会返回 True,其子项可以通 过负载操纵方法来进行访问,例如get_body()、iter_parts() 还有walk()。 事实上你可以使用的语法分析程序接口有两种: Parser API 和增量式的FeedParser API。当你的全部消 息内容都在内存当中,或者整个消息都保存在文件系统内的一个文件当中的时候,Parser API 非常有用。0 码力 | 2052 页 | 9.74 MB | 9 月前3
 Python 标准库参考指南 3.7.13 . . . . . . . . . . . . . . . . . . . . . . . . . . 1155 22.10 urllib.robotparser --- robots.txt 语法分析程序 . . . . . . . . . . . . . . . . . . . . . . . . 1155 22.11 http --- HTTP 模块 . . . . . . . . . 和其他相关方法添加消息负载;或者通过解析一个电子邮件消息的序 列化表达来创建消息对象结构。 email 包提供了一个可以理解包含 MIME 文档在内的绝大多数电子邮件文档结构的标准语法分析程序。你 可以传递给语法分析程序一个字节串、字符串或者文件对象,语法分析程序会返回给你对应于该对象结构的 根EmailMessage 实例。对于简单的、非 MIME 的消息,这个根对象的负载很可能就是一个包含了该消息 文字内容的字符串。对于 消息,调用根对象的is_multipart() 方法会返回 True,其子项可以通 过负载操纵方法来进行访问,例如get_body()、iter_parts() 还有walk()。 事实上你可以使用的语法分析程序接口有两种: Parser API 和增量式的FeedParser API。当你的全部消 息内容都在内存当中,或者整个消息都保存在文件系统内的一个文件当中的时候,Parser API 非常有用。0 码力 | 1961 页 | 9.14 MB | 9 月前3 Python 标准库参考指南 3.7.13 . . . . . . . . . . . . . . . . . . . . . . . . . . 1155 22.10 urllib.robotparser --- robots.txt 语法分析程序 . . . . . . . . . . . . . . . . . . . . . . . . 1155 22.11 http --- HTTP 模块 . . . . . . . . . 和其他相关方法添加消息负载;或者通过解析一个电子邮件消息的序 列化表达来创建消息对象结构。 email 包提供了一个可以理解包含 MIME 文档在内的绝大多数电子邮件文档结构的标准语法分析程序。你 可以传递给语法分析程序一个字节串、字符串或者文件对象,语法分析程序会返回给你对应于该对象结构的 根EmailMessage 实例。对于简单的、非 MIME 的消息,这个根对象的负载很可能就是一个包含了该消息 文字内容的字符串。对于 消息,调用根对象的is_multipart() 方法会返回 True,其子项可以通 过负载操纵方法来进行访问,例如get_body()、iter_parts() 还有walk()。 事实上你可以使用的语法分析程序接口有两种: Parser API 和增量式的FeedParser API。当你的全部消 息内容都在内存当中,或者整个消息都保存在文件系统内的一个文件当中的时候,Parser API 非常有用。0 码力 | 1961 页 | 9.14 MB | 9 月前3
共 33 条
- 1
- 2
- 3
- 4













