第一部分

控制语句中的类型检查

因为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: }

相关文章:

  • 2021-12-10
  • 2022-01-14
  • 2021-07-05
  • 2022-02-06
  • 2021-12-12
  • 2021-10-16
  • 2021-12-07
  • 2021-07-28
猜你喜欢
  • 2022-01-13
  • 2022-01-30
  • 2022-02-21
  • 2021-08-13
  • 2021-07-25
  • 2021-11-27
  • 2021-12-31
相关资源
相似解决方案