
TincyC编译器实现
文章平均质量分 80
TincyC编译器实现
Stardep
篇篇干货,一个不写废话的博主
展开
-
TinyC编译器7—上下文无关文法及分析
1024程序员节 | 征文#词法分析后,源文件的字符流被分割为 token 流了,接下来就开始进行语法分析,分析出源程序的语法结构,将线性的 token 流转化为树状结构,为后续的语义分析和代码生成做准备。原创 2024-10-25 11:09:17 · 1043 阅读 · 6 评论 -
TinyC编译器6—用 flex 做词法分析
在这里可以定义正则表达式中的一些名字,可以在。原创 2024-10-25 09:01:20 · 462 阅读 · 5 评论 -
TinyC编译器5—词法分析
只有一个空句子的集合是一个正则语言,只有一个单符号句子的集合也是一个正则语言。如以下每个集合都是一个正则语言:{ε}, {a}, {b}, ..., {z}。注意:{ε} 不要和空集搞混了,空集中没有任何元素,但是{ε} 中有一个空句子元素。如果句子集合 R1 和 R2 是正则语言,则 R1 和 R2 的并集 R 也是一个正则语言,R = R1 ∪ R2。如果句子集合 R1 和 R2 是正则语言,则 R1 和 R2 的连接集合 R 也是一个正则语言。原创 2024-10-23 02:00:51 · 971 阅读 · 10 评论 -
TinyC编译器4—编译器基本流程
编译器:将一种程序语言翻译为另一种程序语言的计算机程序。一般来说,源程序为高级语言,而目标语言则是汇编语言或者机器码。一开始的程序员是用机器码写程序,非常容易出错,后来开始使用汇编语言开始写,但是依旧不高效,后来在50-60年代,有人发明了高级语言及编译器,这就导致写程序就像写数学公式推理一样,方便了很多。所以开发编译器是很重要的。原创 2024-08-19 22:17:02 · 981 阅读 · 0 评论 -
TinyC编译器5—词法分析
词法分析也称为分词,此阶段编译器从左向右扫描源文件,将其字符流扫描分割成一个个的词(记号、token)。所谓token,就是源文件中不可再进一步分割的一串字符,类似英语中的单词,汉语中的词。原创 2024-08-22 17:42:30 · 726 阅读 · 0 评论 -
TinyC编译器3—中间代码Pcode(下)
命令。...push 1push 2$sumFUNC @sum:arg a, bpush apush baddret ~ENDFUNCFUN和ENDFUN用于函数的开始和结尾,FUN后的函数名用@开头,这是为了不与系统命令冲突,因为在C语言中有可能会定义一个名为add或push等和系统命令同名的函数。函数名后接一个冒号。函数体内的第一个命令为arg,这是声明函数参数用的,但是此命令不能和FUNC写在同一行。如果函数没有参数,则此命令可以去掉。原创 2024-08-12 00:24:43 · 492 阅读 · 5 评论 -
TinyC编译器2—中间代码Pcode(上)
pop a 命令运行后,栈顶的元素被取出,并将其值赋给了变量 a ,相当于 a = stack.pop() ,此命令是唯一一个能给。命令,声明变量,向下增长栈的空间,将新增的空间分配(绑定)给刚声明的变量,并将变量名及分配给它的地址保存到变量表中。当执行pop命令的时候,如果后面是一个变量名,那么虚拟机就会将栈顶元素的值赋值给那个变量,同时栈顶元素也就没了。上面的代码中用 “ ~ ” 来代表栈顶,这将是 Pcode 中的一个约定。命令,将元素放入栈顶,或取出栈顶元素。注意:当虚拟机执行push命令的时候。原创 2024-08-10 11:27:32 · 630 阅读 · 4 评论 -
TinyC编译器1—语法
此文件中提供了 print 和 readint 函数,另外,将所有 C 语言支持、但 TinyC 不支持的关键词全部 define 成空名称,这样来保证 gcc 和 TinyC 编译器的效果差不多。第一行的 #include “for_gcc_build.hh” 是为了利用gcc来编译该文件的,TinyC 编译器会注释掉该行。支持这些逻辑运算符:+, -, *, /, %, ==,!注意:如果系统么有安装gcc,那根据不同的系统进行网上查找安装教程。原创 2024-08-07 12:37:15 · 807 阅读 · 3 评论