续 第一部分
控制语句中的类型检查
因为Pascal控制语句中有表达式,所以它们的解析器同样需要做类型检查。
清单10-2 展示了语句解析子类AssignmentStatementParser新版本的parse()方法。(留意加粗部分)
/**
* 解析如 a = xx+yy; 之类的赋值语句
* 会有左值/右值两个子节点,并且节点类型与左值类型保持一致
* @param token
* 第一个token,肯定是identifier了。
* @return 语句子树根节点
* @throws Exception
*/
public ICodeNode parse(Token token) throws Exception {
10: ICodeNode assignNode = ICodeFactory.createICodeNode(ASSIGN);
//交由变量解析左边的变量
this);
13: ICodeNode targetNode = variableParser.parse(token);
14: TypeSpec targetType = targetNode != null ? targetNode.getTypeSpec()
15: : Predefined.undefinedType;
16: assignNode.addChild(targetNode);
//等号处同步
18: token = synchronize(COLON_EQUALS_SET);
// 找不到赋值:=就报错,找到就吞噬
if (token.getType() == COLON_EQUALS) {
21: token = nextToken();
else {
this);
24: }
// 解析赋值语句右边的表达式,将其子树作为赋值节点的第二个孩子
this);
27: ICodeNode exprNode = expressionParser.parse(token);
28: assignNode.addChild(exprNode);
//左值变量,右值表达式,是否能赋值兼容。
30: TypeSpec exprType = exprNode != null ? exprNode.getTypeSpec()
31: : Predefined.undefinedType;
if (!TypeChecker.areAssignmentCompatible(targetType, exprType)) {
this);
34: }
35: assignNode.setTypeSpec(targetType);
return assignNode;
37: }