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变量统一存储其字符串形式。