- 遍历字符流,不需回溯
- 没用DFA,全程if-else,思路很好理解
- 识别单词的时候分为:1-标识符关键字,2-整数,3-符合运算符,4-单独字符
- 类别码是1,2,3...,用enum在头文件里定义了。
- 单独字符的类型码统一定义在ssym数组里了,关键字的类型码统一定义在wsym数组里了。因为他们是一一对应的,用数组比较简洁。
- 识别到token就直接输出了,万事从简(懒)...理解思想和方法就可再改进
- C 库函数
int isalpha(int c):判断字符是否是字母,int isdigit (int c):判断字符是否是数字。当然也直接用ASCII码。 - C 库函数
int strcmp(const char *str1, const char *str2)把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
- 遍历字符流,遇到不能识别的字符而结束本次识别时,回退一个字符,让它能被继续识别
- 重点:有限状态机三段式:(1)定义状态(2)根据现态和当前字符计算次态(3)更新现态 (和数字逻辑里的时序电路FSM设计一样)
- 对于细节要耐心,注释和空格回车等字符的处理,获取下一个字符的时机
没有错误诊断处理,遇到错误只是直接报错
- I/O 的功能扩展:增加格式化输入、格式化输出。
- 数据结构的扩展:增加浮点数。
- 增加数组功能:实现整型数组和浮点型数组。
- 浮点数操作:实现浮点数向下取整和向上取整。
- 次方函数:2次方,3次方系统函数
存储组织上无法回避的问题:
用栈。每一次过程调用都会生成一个栈帧,在栈上开辟空间时,必须先开辟3个空间保存“静态链、动态链、返回地址”。
- 静态链:定义关系中上一层的过程在栈中基地址
- 静态链:执行关系中上一个栈帧的基地址
- 返回地址:结束本次调用,返回到上层过程后下一条需要指令的地址
内存中设计不同的存储区,比如heap,stack,static data,program...,具体划分与CPU的体系结构和OS有关
- stack:存储调用结束即可被销毁的局部量
- static data:存储全局变量、Pl/0的常量中的等生命周期长的
- heap:不符合上述两种,可以手动申请和释放的,比如C语言中的malloc
内存分配策略:
- 静态分配(编译时就分配好):比如分配大小固定、可全程访问的“全局变量、静态变量、常量、类的虚函数表”
- 动态分配(运行时才分配):包括栈式分配/堆式分配 使用静态链,对应base(),沿着静态链寻找非局部量的存储位置。