code: private LVal parseAccessLVal(int start, EnclosingScope scope) {
  		LVal lhs = parseLValTerm(start, scope);
  		Token token;
  
  		while ((token = tryAndMatchOnLine(LeftSquare)) != null
  				|| (token = tryAndMatch(true, Dot, MinusGreater)) != null) {
  			switch (token.kind) {
  			case LeftSquare:
  				// NOTE: expression is terminated by ']'
  				Expr rhs = parseAdditiveExpression(scope, true);
  				match(RightSquare);
  				lhs = new Expr.ArrayAccess(Type.Void, lhs, rhs);
  				break;
  			case MinusGreater:
  				lhs = new Expr.Dereference(Type.Void, lhs);
  				// Fall Through
  			case Dot:
  				Identifier name = parseIdentifier();
  				lhs = new Expr.RecordAccess(Type.Void, lhs, name);
  				break;
  			}
  			lhs = annotateSourceLocation(lhs,start);
  		}
  
  		return lhs;
  	}
docs: Parse an access lval, which is of the form:
  
  <pre>
  AccessLVal ::= TermLVal
  | AccessLVal '.' Identifier     // Field assignment
  | AccessLVal '->' Identifier // dereference field assigmment
  | '*' AccessLVal  // dereference assigmment
  | AccessLVal '[' Expr ']' // index assigmment
  </pre>
  
  @param scope
  The enclosing scope for this statement, which determines the
  set of visible (i.e. declared) variables and also the current
  indentation level.
  
  @return