词法分析
判断关键字或变量
解释:
- 0 -> 1:识别标识符的开始
- 1 -> token:识别单字母标识符
- 1 -> 2:识别标识符的延续
- 2 -> 2:继续识别标识符
- 2 -> token:在遇到非标识符字符时完成标识符的识别
- token -> 关键字:如果标识符在字典中,则分类为关键字
- token -> 变量:如果标识符不在字典中,则分类为变量
判断字符串
判断操作符
判断数值
合并
语法分析
利用产生式进行语法分析,将词法单元解析为 AST
生成式类似递归的递推公式
变量的定义与赋值
if 语句
function 语句
语句和块
数据结构
调用顺序
根据 SDD 将 AST 转为三地址代码
利用语法制导定义(SDD,Syntax Directed Definition)将 AST 翻译为三地址代码
四则运算
E -> E + T | T
T -> T * F | F
F -> digit
digit -> 0|1|2|...|9
利用翻译形成代码
符号表
用于存储符号(变量、常量、标签)在源代码中的位置、数据类型,以及位置信息决定的词法作用域和运行时的相对内存地址。
符号(Symbol)的抽象
- 常量(Immediate Symbol)
- 变量(Address Symbol)
- 标签(Label Symbol)
符号表
class SymbolTable {
List<Symbol> symbols;
List<SymbolTable> children;
}
示意图:
示例
执行到第一个语句块时栈的情况:
补充:Tinyscript 程序的内存分布
三地址代码
三地址指令(TAInstruction)有以下几部分构成:
type
,类型,比如 if、assign、goto、label、call、return、sp、paramresult
,结果,比如 assign 语句等号左边的值operator
,操作符arg1
,操作数1arg2
,操作数2
示例: