Support multi-letter local variables
这个commit是上一个《Support single-letter local variables》的升级完善。上一个commit基本已经搭好了大体的框架,此次修改也不是很大。 知识点 支持多字母变量面临主要的问题还是:如何分配变量地址、如何寻址。还好基本他在 parse解决了。 一.tokenize修改 Token *tokenize(void) { //... ...
这个commit是上一个《Support single-letter local variables》的升级完善。上一个commit基本已经搭好了大体的框架,此次修改也不是很大。 知识点 支持多字母变量面临主要的问题还是:如何分配变量地址、如何寻址。还好基本他在 parse解决了。 一.tokenize修改 Token *tokenize(void) { //... ...
支持单字母本地变量。需要注意的是他这里只支持小写字母。 知识点 这次commit主要的修改还是parse和codegen,tokenize有小的修改 一.tokenize部分修改 tokenize部分在TokenKind增加了一个TK_IDENT(标识符)类型,现在切割的标识符就是 a-z 的字母 Token *tokenize(void) { //.. while (*p...
直接翻译过来是“添加表达式概念语句”,没搞明白他写这个commit的作用是什么。 知识点 从他的代码修改看是为了在codegen中移除遍历Node时每次调用gen后再生成附加的pop指令 一.parse部分修改 添加了一个ND_EXPR_STMT节点类型用于在构造纯表达式语句。 static Node *stmt(void) { //... Node *node = new...
支持return语句 知识点 一.tokenize部分 tokenize部分为了切割出return关键词非常粗暴的通过判断字符串的开头是否return Token *tokenize(void) { //... while (*p) { // Skip whitespace characters. if (isspace(*p)) { p++; ...
通过分号分割多个语句。 知识点 分号(;)属于c函数ispunct处理的符号,所以tokenize不需要修改。codegen有小修改,稍微大点的修改是parse. 一.parse修改 之前处理的输入都是单语句,现在可以处理多语句。来看他的语法分析部分 // program = stmt* // stmt = expr ";" 一个语句(stmt)由表达式(expr)以分号...
将main源文件里的词法、语法、代码生成分离成对应的tokenize、parse、codegen文件,而chibi.h头文件存储公共部分。 知识点 主要涉及的知识点在Makefile的修改。 Makefile Makefile的注释来此rvcc # C编译器参数:使用C11标准,生成debug信息,禁止将未初始化的全局变量放入到common段 CFLAGS=-std=c11 -g ...
支持 ==、!=、<=、>=比较符号。 知识点 一.词法部分修改 在判断单一的标点符号前先判断字符是不是 ==、!=、<=、>=。 //... while(*p){ //... if(startswith(p,"==") || startswith(p,"!=") ||startswith(p,"<=")|...
将词法切割出的字符用字符串表示,现在只处理 +-*/()符号。为后续要处理关键字、不止一个字符的符号做准备 知识点 一个strncmp函数,比较两个字符串的特定长度,相等则返回0
增加+、- 一元符号。当组合成 ++、– 时并不是C语言里的递增和递减,而是数学意义上的取正数和取反(或者简单的理解为正负符号)。 知识点 一.数学意义的正负 +num单独出现那在数学中是一个正数。正数不需要运算,其值就是它自己; -num单独出现那在数学中是一个负数。负数就是在正数上取反运算,用数学表达那可以是:0-num(是不是有点绕😂). 二.怎么区分是加号还是一元符 2-...
这节实现了简单的加减乘除计算器。有基本的词法、语法、代码生成的三个过程。 知识点 一.C语言 ispunct:判断字符是否为标点符号(ctype.h) 二.汇编 x86 cdq CDQ(Convert Double to Quad,将双字数据扩展为四字),通常出现在除法运算之前.将符号 EAX 位扩展到 EDX ...