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
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的语法设计非常精巧,很难在程序中识别一个模板的声明, 此外还会对某些函数模板进行语法分析可能非常 难。[...] 最后 的模板语法被设计为: templateT& 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
Greenplum数据库架构分析及5.x新功能分享16 Pivotal Confidential–Inter nal Use Only 解析器 主节点Segment 系统表 优化器 分布式事务 调度器 执行器 解析器执行词法分 析、语法分析并生 成 解析树 客户端 主节点接受客户连接, 处理请求,执行认证 解析器 主节点 17 Pivotal Confidential–Inter nal Use Only 优化器 本地存储0 码力 | 44 页 | 8.35 MB | 1 年前3
make & Makefile. . . . . . . . . . . . . . . . make & Makefile . make 的工作原理 . . make通过读取一个Makefile文件,首先对该文件进行语法分析, 如果Makefile文件格式有误,则报错并退出执行; 如果输入的Makefile文件文法正确,make分析Makefile文件中描 述的目标 (Targets)和前提 (Prerequisites)的关系,并建立一颗非环0 码力 | 36 页 | 975.98 KB | 1 年前3
跟我一起写 Makefile (PDF 重制版)2. 隐含规则一览 63 , 发行版本 1.0.c 的依赖文件被自动推导为 n.y (Yacc 生成的文件),其生成命令是:$(YACC) $(YFALGS) 。(“Yacc”是一个语法分析器,关于其细节请查看相关资料) 10. Lex C 程序时的隐含规则。 .c 的依赖文件被自动推导为 n.l(Lex 生成的文件),其生成命令是:$(LEX) $(LFALGS) 。(关 0 码力 | 81 页 | 628.51 KB | 1 年前3
TypeScript Handbook(中文版)
NET v5使用TypeScript TypeScript Handbook(中文版) 516 结合ASP.NET v5使用TypeScript 层次概述 核心TypeScript编译器 语法分析器(Parser): 以一系列原文件开始, 根据语言的语法, 生成抽 象语法树(AST) 联合器(Binder): 使用一个 Symbol 将针对相同结构的声明联合在一 起(例如:同一个接 架构概述 编译过程概述 整个过程从预处理开始。 预处理器会算出哪些文件参与编译,它会去查找如下引用 ( ///标签和 import 语句)。 语法分析器(Parser)生成抽象语法树(AST) Node . 这些仅为用户输出的抽象 表现,以树的形式。 一个 SourceFile 对象表示一个给定文件的AST并且带有一 些额外的信息如文件名及源文件内容。 0 码力 | 557 页 | 7.48 MB | 1 年前3
Object Pascal 参考手册(Ver 0.1) I := 100; 产生一个错误,但 ... I := 99; Inc(I); 把值 100 赋给 I(除非打开编译器的边界检查功能)。 在子界类型的定义中,常量表达式的使用会使语法分析出现困难。在任何类型的声明中,当‘=’后面 的第一个(有意义的)字符是左圆括号时,编译器就假定是在定义一个枚举类型。因此,下面的代码 const X = 50; Y = 10; type0 码力 | 168 页 | 868.25 KB | 1 年前3
共 37 条
- 1
- 2
- 3
- 4













