02 2021 档案

摘要:First Example grammar Hello; r : 'hello' ID ; // match keyword hello followed by an identifier ID : [a-z]+ ; // match lower-case identifiers WS : [ \t 阅读全文
posted @ 2021-02-08 18:12 雪溯 阅读(121) 评论(0) 推荐(0) 编辑
摘要:15.1 确认编译结果 cbc --print-asm -fverbose-asm xx.cb可以看到汇编代码。gcc -S -o - xx.c也可以。 root@cf43f429204e:/# cbc --print-asm -fverbose-asm if_test.cb .file "if_t 阅读全文
posted @ 2021-02-07 16:56 雪溯 阅读(172) 评论(0) 推荐(0) 编辑
摘要:14.1 程序调用约定 C语言本身的语法特性是与平台无关的,但是具体实现语法特性本身,也就是编译往往会随着OS和CPU软硬件条件而有所不同。比如参数传递是入栈还是用寄存器,返回值的传递方法是用什么寄存器等。规定这些的就是程序调用约定calling convention。 Linux的调用约定在LSB 阅读全文
posted @ 2021-02-06 22:34 雪溯 阅读(285) 评论(0) 推荐(0) 编辑
摘要:12.2 x86系列的CPU历史 遵循同一指令集架构的CPU应该能够执行依据该指令集架构编译的程序 MMX指令用于整数并行处理,SSE用于浮点数并行处理 AMD先于Intel提出了x86系列的64位扩展,其指令集架构称为AMD64,之后Intel提出了自己的Intel64,AMD64和Intel64 阅读全文
posted @ 2021-02-06 20:24 雪溯 阅读(249) 评论(0) 推荐(0) 编辑
摘要:11.1 IR Cb使用的是树形IR。 cbc --dump-ir if_test.cb <<IR>> (if_test.cb:1) variables: functions: <<DefinedFunction>> (if_test.cb:2) name: main isPrivate: fals 阅读全文
posted @ 2021-02-06 18:25 雪溯 阅读(192) 评论(0) 推荐(0) 编辑
摘要:10.1 类型定义检查 主要解决: 包含void的数组,结构体,联合体 成员重复的结构,联合体 循环定义的结构,联合体-需要检查有没有引用闭环 class TypeChecker extends Visitor { private final TypeTable typeTable; private 阅读全文
posted @ 2021-02-06 17:29 雪溯 阅读(128) 评论(0) 推荐(0) 编辑
摘要:9.1 语义分析概要 本章目的 引用消解 类型名称消解: TypeRef->Type 类型定义检查:比如不能新建void的数组,void的成员结构体,直接将自身类型作为子成员的结构体等问题 表达式有效性检查: 比如1++ 静态类型检查,比如在结构体间进行了未定义的+操作,或者是将int类型的值直接赋 阅读全文
posted @ 2021-02-06 16:39 雪溯 阅读(147) 评论(0) 推荐(0) 编辑
摘要:8.1 表达式的抽象语法树 Literal Type表示类型的定义,如struct pr{int first; int second;},TypeRef则是类型的名称。struct pr; 定义TypeRef后,在类型定义之前就能编写用到了该类型的代码。 // #@@range/primary{ E 阅读全文
posted @ 2021-02-06 00:04 雪溯 阅读(263) 评论(0) 推荐(0) 编辑
摘要:7.1 JavaCC中的Action javacc的规则中可以声明,定义,计算和返回变量。 返回的语义值类型 非终端符号名 参数列表 { 临时变量声明 } { 规则{action} } 注意符号串的中间可以调用action。执行完action之后会看看后面有没有没匹配完的符号,会继续执行匹配。 e. 阅读全文
posted @ 2021-02-05 18:31 雪溯 阅读(407) 评论(0) 推荐(0) 编辑
摘要:6.1 定义的分析 表示程序整体 compilation_unit(): {} { import_stmts() top_defs() <EOF> } import import_stmts(): {} { (import_stmt())* } import_stmt():{} { <IMPORT> 阅读全文
posted @ 2021-02-05 17:54 雪溯 阅读(284) 评论(0) 推荐(0) 编辑
摘要:5。1 基于EBNF语法的描述 种类 含义 e.g 终端符 token , , '=', "Var" 非终端符 语法树非叶节点 stmt(), expr() 可以省略的元素用[]括起: e.g: storage() typeref() name ["=" expr()] ";" 5.2 语法二义性和 阅读全文
posted @ 2021-02-05 16:09 雪溯 阅读(201) 评论(0) 推荐(0) 编辑
摘要:4.1 javacc正则表达式 e.g: 固定字符串:"int" 连接:"ABC" "XYC" 字符组: ["A", "B"] 排除: ~["X", "Y"] 任意字符: ~[] ("o")+ ("o")? ("o")* ("o"){5} ("o"){3,5} "int"|"Int" 4.2 扫描没 阅读全文
posted @ 2021-02-05 14:24 雪溯 阅读(230) 评论(0) 推荐(0) 编辑
摘要:3.1 语法分析的概要 解析器往往会跳过分号和括号等没有必要保存的元素,所以parser一般生成的语法树已经不再严格对应代码本身 3.2 解析器生成器 常用的解析器一般使用LR, LALR和LL文法。速度上: LL>LALR>LR,解析范围上: LL<LALR<LR。目前最主流的是LALR(yacc 阅读全文
posted @ 2021-02-05 13:28 雪溯 阅读(186) 评论(0) 推荐(0) 编辑
摘要:2.1 Cb语言的概要 删除了以下功能 预处理器 浮点数 K&R语法 enum struct的bit field struct和union的赋值 struct和union的返回值 逗号表达式 const volatile auto register import 用import 关键字替代了#inc 阅读全文
posted @ 2021-02-05 10:16 雪溯 阅读(373) 评论(0) 推荐(0) 编辑
摘要:1.1 概要 目标 从头制作Cb编译器 可执行文件是怎样的文件 在Linux上,是符合ELF(Executable and Linking Format)。file命令能够查看文件时是否ELF形式。ELF代码中包含机器语言。 gcc命令是如何生成可执行文件的 一般来说,需要经过预处理->编译->(狭 阅读全文
posted @ 2021-02-03 21:37 雪溯 阅读(773) 评论(0) 推荐(0) 编辑
摘要:题目 http://poj.org/problem?id=1201 题意 给你n个整数区间(5e4数量级),要求给出一个最小的整数集合,这个整数集合至少与第i个区间有ci个重合整数 思路 很裸的差分约束,若令dp[w]为在[0, w]中取多少个整数,明显dp[bi] - dp[ai-1] = ci。 阅读全文
posted @ 2021-02-03 17:56 雪溯 阅读(66) 评论(0) 推荐(0) 编辑
摘要:题目 http://poj.org/problem?id=3267 题意 有长为L的字符串(L<=600),现在问最少去掉多少个字符,使得字符串由字典中的词不重叠地构成。 字典中含有k(k<=300)个词,每个词长度最多为25 思路 最粗暴的想法:假设当前已经匹配到i为第k个单词的结尾,向前找到第k 阅读全文
posted @ 2021-02-03 00:54 雪溯 阅读(42) 评论(0) 推荐(0) 编辑
摘要:题目 http://poj.org/problem?id=1276 题意 一台机器,里面有N种钱,第k种钱币值为Dk,共有Nk张。问不超过cash最多能取出多少钱。 思路 最最简单的可达性dp。 代码 Mem: 384K Time: 329MS #include <iostream> #includ 阅读全文
posted @ 2021-02-02 23:57 雪溯 阅读(52) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示