1.1实现细节
1.1.1 各节点类的行号设计
节点类 | 行号 |
---|---|
_Expression:变量引用 | _VariantReference所在行号 |
_Expression:无符号整数 | 无符号整数所在行号 |
_Expression:无符号浮点数 | 无符号浮点数所在行号 |
_Expression:字符常量 | 字符常量所在行号 |
_Expression:函数调用 | _FunctionCall所在行号 |
_Expression:包含运算符的复合表达式 | 第一个操作数表达式的行号(递归定义) |
_FunctionCall | 函数名标识符所在行号 |
_VariantReference | 变量/常量/数组/函数名标识符所在行号 |
_Statement:_Compound | BEGIN关键字所在行号 |
_Statement:_RepeatStatement | REPEAT关键字所在行号 |
_Statement:_WhileStatement | WHILE关键字所在行号 |
_Statement:_ForStatement | FOR关键字所在行号 |
_Statement:_IfStatement | IF关键字所在行号 |
_Statement:_AssignStatement | :=赋值号所在行号 |
_Statement:_ProcedureCall | 过程名标识符所在行号 |
_Type | 基本类型关键字所在行号 |
_FormalParameter | 参数名标识符所在行号 |
_FunctionDefinition | 函数名标识符所在行号 |
_Variant | 变量名标识符所在行号 |
_Constant | 常量名标识符所在行号 |
_SubProgram | 无行号 |
_Program | 主程序名所在行号 |
1.1.2 左递归与列表反转
PASCAL-S的文法中,涉及到递归的,均为左递归,所以在先序遍历语法分析树时,先识别的语法成分实际上在源代码中是后出现的,所以在列表识别完毕时,需要将列表进行反转,以符合实际的顺序。
另外需要特别注意的是,idList在一些地方只单独出现一次,例如主程序参数列表;而在一些地方会出现多次,例如子程序参数列表。在前者的情况中,最后需要反转列表;在后者的情况中,则不需要反转列表,反转列表的操作由更高层的语法成分完成。
1.1.3 常量值保存
常量值保存下来,一方面可以方便后续计算常量表达式的值、常量定义的常数传播、数组常量下标的越界检查等,另一方面是为了代码生成。考虑到这两方面的需求,所以在_Constant节点中,有具体类型的域保存其具体的取值,另外还用一个string变量统一存储其字符串形式。